C#: Line information when parsing XML with XmlDocument

情到浓时终转凉″ 提交于 2019-12-19 06:18:44

问题


What are my options for parsing an XML file with XmlDocument and still retain line information for error messages later on? (as an aside, is it possible to do the same thing with XML Deserialisation?)

Options seem to include:

  • Extending the DOM and using IXmlLineInfo
  • Using XPathDocument

回答1:


The only other option I know of is XDocument.Load(), whose overloads accept LoadOptions.SetLineInfo. This would be consumed in much the same way as an XmlDocument.

Example




回答2:


(Expanding answer from @Andy's comment)

There is no built in way to do this using XmlDocument (if you are using XDocument, you can use the XDocument.Load() overload which accepts LoadOptions.SetLineInfo - see this question).

While there's no built-in way, you can use the PositionXmlDocument wrapper class from here (from the SharpDevelop project):

https://github.com/icsharpcode/WpfDesigner/blob/5a994b0ff55b9e8f5c41c4573a4e970406ed2fcd/WpfDesign.XamlDom/Project/PositionXmlDocument.cs

In order to use it, you will need to use the Load overload that accepts an XmlReader (the other Load overloads will go to the regular XmlDocument class, which will not give you line number information). If you are currently using the XmlDocument.Load overload that accepts a filename, you will need to change your code as follows:

using (var reader = new XmlTextReader(filename))
{
    var doc = new PositionXmlDocument();
    doc.Load(reader);
}

Now, you should be able to cast any XmlNode from this document to a PositionXmlElement to retrieve line number and column:

var node = doc.ChildNodes[1];
var elem = (PositionXmlElement) node;
Console.WriteLine("Line: {0}, Position: {1}", elem.LineNumber, elem.LinePosition);


来源:https://stackoverflow.com/questions/5628980/c-line-information-when-parsing-xml-with-xmldocument

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!