【问题标题】:C#: Line information when parsing XML with XmlDocumentC#:使用 XmlDocument 解析 XML 时的行信息
【发布时间】:2011-08-03 11:50:06
【问题描述】:

使用 XmlDocument 解析 XML 文件并在以后仍保留行信息以用于错误消息时,我有哪些选择? (顺便说一句,是否可以使用 XML 反序列化做同样的事情?)

选项似乎包括:

【问题讨论】:

    标签: c# xml xmldocument


    【解决方案1】:

    我知道的唯一其他选项是XDocument.Load(),它的重载接受LoadOptions.SetLineInfo。这与XmlDocument 的使用方式大致相同。

    Example

    【讨论】:

    • 对于当前的 .net 这会很棒.. 但不幸的是,我仍在为 80 年代的 .net 2.0 写作。 (我会在问题中提到,但我不想与帖子约会)
    • 我认为可能是这样。在其他两者之间,我想我更喜欢XPathDocument 方法。
    • @Andy 这应该是一个答案.. 如果你坚持使用旧 C#,它会很好。
    【解决方案2】:

    (来自@Andy 评论的扩展答案)

    没有使用XmlDocument 的内置方法(如果您使用的是XDocument,则可以使用接受LoadOptions.SetLineInfoXDocument.Load() 重载 - 请参阅this question)。

    虽然没有内置方式,但您可以使用此处的 PositionXmlDocument 包装类(来自 SharpDevelop 项目):

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

    为了使用它,您需要使用接受XmlReaderLoad 重载(其他Load 重载将转到常规XmlDocument 类,它不会为您提供行号信息)。如果您当前正在使用接受文件名的XmlDocument.Load 重载,则需要按如下方式更改代码:

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

    现在,您应该可以将此文档中的任何 XmlNode 转换为 PositionXmlElement 以检索行号和列:

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

    【讨论】:

    • 这对于添加追溯非常有用-我已经编写了很多基于 XmlDocument 的代码,只需添加此文件,然后添加建议的 3 行代码,我就能获得有用的位置用户反馈:) ...您需要添加 using ICSharpCode.WpfDesign.XamlDom; - 这对 C# 用户来说可能非常明显,但我是 C# 的新手 :o ... +1!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    相关资源
    最近更新 更多