C# 验证xml并查找错误行和列
我有一个这样的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>
<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 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!!!
}
}
}