C# 验证xml并查找错误行和列

C# 验证xml并查找错误行和列,c#,xml,validation,xml-parsing,xml-serialization,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></sal

我有一个这样的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>
我能够做到这一点。我真正想知道的是xml文档中的错误到底在哪里,比如哪一行和哪一列


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

您正在像这样关闭“年龄”标签

 <age>35<age/>
35
应该是

<age>35</age>
35

希望这对您有用。

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

现在,关于XML文档的有效性,一个有效的XML文档应该具有以下内容:

  • XML文档必须具有根元素
  • XML元素必须有结束标记
  • XML标记区分大小写
  • XML元素必须正确嵌套 -XML属性值必须被引用
现在尝试将其添加到xml文档的顶部

<?xml version="1.0" encoding="ISO-8859-1"?>
如果您有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);
}
XmlDocument doc = new XmlDocument();
doc.Load(XMLFilePath);
完整示例:

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!!!
        }
    }
}
stringxml=@”

),但您必须使用
LoadOptions加载文档。SetLineInfo

我认为这与问题无关。harin04想要创建一个验证xml文件的方法。@Tobias是的,我想要一个验证并给出错误行和列的方法。因此,通过这种方式,我必须验证每个人吗单独标记,然后找到错误行?@harin04您是想要验证其xml文件的人,而不是我。如果您问我“有没有办法为xml文件设置一些规则并检查它们?”“,然后回答是是和否。xsd可以正式检查文件,可以做一些更复杂的事情,但我不知道是否有针对.NET的schematron验证器。是的,我确实想验证xml文件。但我不想查看每个标记并检查它,因为my xml文件很长,并且不是所有元素都是同一类型的。我想输入一个xml文件并找到错误所在的行。是否有办法跟踪此情况。@harin04如果要检查文件,必须检查所有要检查的元素。我甚至提取了
name
元素,该元素对检查没有用处,但您不需要提取它。请看修改后的示例。@xantos好的。我尝试了这个:)谢谢你的建议:)
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!!!
        }
    }
}