如何找到字符串格式错误的位置XML(在C#中)?

时间:2008-10-13 22:23:40

标签: c# xml algorithm

我正在编写一个轻量级的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;
        }
    }
}

4 个答案:

答案 0 :(得分:5)

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

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());
}

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

除了检查文档是否格式正确之外,如果要对模式进行验证,也可以使用XmlValidatingReader。

答案 3 :(得分:0)

您希望通过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;
}