1

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

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

4

3 回答 3

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

于 2013-09-05T07:56:03.823 回答
1

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

 <age>35<age/>

它应该像

<age>35</age>

希望这对你有用。

于 2013-09-05T07:23:18.007 回答
1

首先,您没有指定如何在 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);
于 2013-09-05T07:42:53.370 回答