验证xml并查找错误的行和列

时间:2013-09-05 07:18:08

标签: c# xml validation xml-parsing xml-serialization

我有一个这种xml文档

   <xml>
    <person name="a">
      <age>21</age>
      <salary>50000></salary>
    </person>
    <person name="b">
      <age>25</age>
      <salary>30000></salary>
    </person>
    <person name="c">
      <age>30</age>
      <salary>60000></salary>
    </person>
    <person name="d">
      <age>35</age>
      <salary>150000></salary>
    </person>
   </xml>

现在我试图通过将此文件传递给类似

的方法来验证此文档
  validate(string file)
  {
    // here i have some logic 
    // say i am trying to check if the salary is >50000  and age > 30
    // if it doesn't satisfy the condition i have to return an error

  }

我能够做到这一点。我真正想要的是知道xml文档中的错误究竟在哪里,比如哪一行和哪一行。

我该怎么做?有什么建议吗?

3 个答案:

答案 0 :(得分:1)

您正在关闭此“年龄”标签

 <age>35<age/>

应该是

<age>35</age>

希望这适合你。

答案 1 :(得分:1)

首先,您尚未指定如何在c#中解析XML。这很重要。

现在,对于XML文档的有效性,有效的xml文档应具有以下内容:

  • XML文档必须具有根元素
  • XML元素必须具有结束标记
  • XML标记区分大小写
  • 必须正确嵌套XML元素 必须引用-XML属性值

现在尝试将其添加到xml doc的顶部

<?xml version="1.0" encoding="ISO-8859-1"?>

现在,要解析XML文档,您可以使用XmlDocument类或Linq的XDocument类。 让我们举例XmlDocument

如果您有一个xml字符串,请按如下所示加载Xml:

XmlDocument doc = new XmlDocument();
doc.LoadXml(stringXML);
foreach(XmlNode node in doc.SelectNodes("xml/person/salary"))
{
    var strSalary = node.InnerText;
    var intSalary = Convert.ToInt32(strSalary??0);
}

如果您有xml文件,请按如下所示加载Xml:

XmlDocument doc = new XmlDocument();
doc.Load(XMLFilePath);

答案 2 :(得分:1)

完整示例:

string xml = @"<xml>
<person name=""a"">
  <age>21</age>
  <salary>50000</salary>
</person>
<person name=""b"">
  <age>25</age>
  <salary>30000</salary>
</person>
<person name=""c"">
  <age>30</age>
  <salary>60000</salary>
</person>
<person name=""d"">
  <age>35</age>
  <salary>150000</salary>
</person>
</xml>";

using (var sr = new StringReader(xml))
{
    var xml2 = XDocument.Load(sr, LoadOptions.SetLineInfo);

    foreach (var person in xml2.Root.Elements())
    {
        //string name = (string)person.Attribute("name"); // Unused
        int age = (int)person.Element("age");
        int salary = (int)person.Element("salary");

        // Your check
        bool error = salary > 50000 && age > 30;

        if (error)
        {
            // IMPORTANT PART HERE!!!
            int lineNumber = -1;
            int colNumber = -1;

            var lineInfo = (IXmlLineInfo)person;

            if (lineInfo.HasLineInfo())
            {
                lineNumber = lineInfo.LineNumber;
                colNumber = lineInfo.LinePosition;
            }

            return string.Format("Error on line {0}, col {1}", lineNumber, colNumber);

            // END IMPORTANT PART!!!
        }
    }
}

“技巧”是XElement实施IXmlLineInfo(如here所述),但您必须使用LoadOptions.SetLineInfo加载文档。