验证 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文档中的错误到底在哪里,比如哪行和哪一列。
我应该怎么做?有什么建议吗?
您正在像这样关闭"年龄"标签
<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
加载文档。