我有一个这种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文档中的错误究竟在哪里,比如哪一行和哪一行。
我该怎么做?有什么建议吗?
答案 0 :(得分:1)
您正在关闭此“年龄”标签
<age>35<age/>
应该是
<age>35</age>
希望这适合你。
答案 1 :(得分:1)
首先,您尚未指定如何在c#中解析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
加载文档。