验证 XML 并查找错误行和列

本文关键字:错误 查找 XML 验证 | 更新日期: 2023-09-27 18:30:17

>我有一个这样的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文档中的错误到底在哪里,比如哪行和哪一列。

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

验证 XML 并查找错误行和列

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

 <age>35<age/>

它应该像

<age>35</age>

希望这对你有用。

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

现在,关于 XML 文档的有效性,有效的 xml 文档应具有以下功能:

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

现在尝试将其添加到 XML 文档的顶部

<?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);

完整示例:

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(如此处所述),但您必须使用LoadOptions.SetLineInfo加载文档。