【问题标题】:How can I find the position where a string is malformed XML (in C#)?如何找到字符串格式错误的 XML(在 C# 中)的位置?
【发布时间】:2008-10-13 22:23:39
【问题描述】:

我正在编写一个轻量级的 XML 编辑器,如果用户的输入格式不正确,我想向用户指出问题出在哪里,或者至少是第一个问题出在哪里。有谁知道这方面的现有算法?如果查看代码有帮助,如果我可以填写 FindIndexOfInvalidXml 方法(或类似方法),这将回答我的问题。

using System;

namespace TempConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string text = "<?xml version=\"1.0\"?><tag1><tag2>Some text.</taagg2></tag1>";
            int index = FindIndexOfInvalidXml(text);
            Console.WriteLine(index);
        }

        private static int FindIndexOfInvalidXml(string theString)
        {
            int index = -1;

            //Some logic

            return index;
        }
    }
}

【问题讨论】:

    标签: c# xml algorithm


    【解决方案1】:

    我可能只是作弊。 :) 这将为您提供行号和位置:

    string s = "<?xml version=\"1.0\"?><tag1><tag2>Some text.</taagg2></tag1>";
    System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
    
    try
    {
        doc.LoadXml(s);
    }
    catch(System.Xml.XmlException ex)
    {
        MessageBox.Show(ex.LineNumber.ToString());
        MessageBox.Show(ex.LinePosition.ToString());
    }
    

    【讨论】:

      【解决方案2】:

      除非这是一项学术练习,否则我认为编写自己的 XML 解析器可能不是解决此问题的最佳方式。我可能会检查 System.Xml 命名空间中的 XmlDocument class 并尝试/捕获 exceptions 以获得 Load() 或 LoadXml() 方法。异常的消息属性应该包含错误发生位置的信息(行/列号),我怀疑使用正则表达式来提取这些错误消息和相关的位置信息会更容易。

      【讨论】:

        【解决方案3】:

        您应该能够简单地将字符串加载到 XmlDocument 或 XmlReader 中并捕获 XmlException。 XmlException 类具有 LineNumber 属性和 LinePosition 属性。

        如果除了检查文档是否格式正确之外,还想针对架构进行验证,还可以使用 XmlValidatingReader。

        【讨论】:

          【解决方案4】:

          您希望通过 load 方法将字符串加载到 XmlDocument 对象中,然后捕获任何异常。

          public bool isValidXml(string xml)
          {
              System.Xml.XmlDocument xDoc = null;
              bool valid = false;
              try
              {
                  xDoc = new System.Xml.XmlDocument();
                  xDoc.loadXml(xmlString);
                  valid = true;
              }
              catch
              {
                  // trap for errors
              }
              return valid;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-05-06
            • 1970-01-01
            • 1970-01-01
            • 2012-08-03
            • 1970-01-01
            • 2020-07-18
            • 2021-05-24
            • 1970-01-01
            相关资源
            最近更新 更多