it-swarm-vi.tech

Cách kiểm tra xml hợp lệ trong đầu vào chuỗi trước khi gọi .LoadXml ()

Tôi rất thích làm điều này mà không bắt gặp một ngoại lệ trong LoadXml() và sử dụng kết quả này như một phần logic của tôi. Có ý tưởng nào cho giải pháp không liên quan đến việc tự phân tích cú pháp xml không? Tôi nghĩ VB có giá trị trả về là sai cho hàm này thay vì ném XmlException. Đầu vào Xml được cung cấp từ người dùng. Cảm ơn nhiều!

if (!loaded)
{
     this.m_xTableStructure = new XmlDocument();
     try
     {
          this.m_xTableStructure.LoadXml(input);
          loaded = true;
     }
     catch
     {
          loaded = false;
     }
}
39
Chris Ballance

Chỉ cần bắt ngoại lệ. Chi phí nhỏ từ việc bắt một ngoại lệ bị chết đuối so với phân tích cú pháp XML.

Nếu bạn muốn chức năng (vì lý do phong cách, không phải cho hiệu suất), hãy tự thực hiện nó:

public class MyXmlDocument: XmlDocument
{
  bool TryParseXml(string xml){
    try{
      ParseXml(xml);
      return true;
    }catch(XmlException e){
      return false;
    }
 }
60
Rasmus Faber

Sử dụng XmlValidatingReader sẽ ngăn chặn các trường hợp ngoại lệ, nếu bạn cung cấp Xác thựcEventHandler của riêng bạn.

10
Sunny Milenov

Tôi đã không thể làm cho XmlValidatingReader & ValidationEventHandler hoạt động. XmlException vẫn bị ném cho xml hình thành không chính xác. Tôi đã xác minh điều này bằng cách xem các phương pháp với gương phản xạ.

Tôi thực sự cần xác thực 100 giây đoạn XHTML ngắn mỗi giây.

public static bool IsValidXhtml(this string text)
{
   bool errored = false;
   var reader = new XmlValidatingReader(text, XmlNodeType.Element, new XmlParserContext(null, new XmlNamespaceManager(new NameTable()), null, XmlSpace.None));
   reader.ValidationEventHandler += ((sender, e) => { errored = e.Severity == System.Xml.Schema.XmlSeverityType.Error; });

   while (reader.Read()) { ; }
   reader.Close();
   return !errored;
}

XmlParserContext cũng không hoạt động.

Bất cứ ai cũng thành công với một regex?

6
Dan

Nếu việc nắm bắt là quá nhiều đối với bạn, thì bạn có thể muốn xác thực XML trước đó, bằng cách sử dụng Lược đồ XML, để đảm bảo rằng XML vẫn ổn, nhưng điều đó có thể sẽ tồi tệ hơn việc bắt.

3
Martin Marconcini

NHƯ đã được nói, tôi muốn bắt ngoại lệ, nhưng bằng cách sử dụng XmlParserContext , bạn có thể thử phân tích "thủ công" và chặn bất kỳ sự bất thường nào; tuy nhiên, trừ khi bạn phân tích cú pháp 100 xml mỗi giây, tại sao không bắt ngoại lệ?

1
Martin Marconcini