使用 System.Xml.XmlDocument 时是不是可以从 System.Xml.XmlNode 获取行号/位置?
Posted
技术标签:
【中文标题】使用 System.Xml.XmlDocument 时是不是可以从 System.Xml.XmlNode 获取行号/位置?【英文标题】:Is it possible to get line numbers/positions from a System.Xml.XmlNode when working with a System.Xml.XmlDocument?使用 System.Xml.XmlDocument 时是否可以从 System.Xml.XmlNode 获取行号/位置? 【发布时间】:2014-02-25 12:59:00 【问题描述】:标题说明了一切......
在使用System.Xml.XmlDocument
时,是否可以从System.Xml.XmlNode
获取行号/位置?
我想要这些信息,以便我可以通知用户他们需要在 Xml 文件中查找特定信息的位置。我在 SO 上看到过与XmlReader
相关的类似问题,但没有任何内容能真正回答我的问题。
我想我可以在 xml 文件中搜索我感兴趣的节点的 OuterXml
,但这似乎很麻烦,如果该信息多次出现在文件中怎么办?一定有更好的办法吗?
更新: 我正在使用以下方式加载我的 xml 文件:
xmlDoc = new XmlDocument();
xmlDoc.PreserveWhitespace = true;
xmlDoc.Load(filename);
【问题讨论】:
C#: Line information when parsing XML with XmlDocument的可能重复 【参考方案1】:我不确定这是否会对某人有所帮助,但我的目标与 OP 相似。在我的特殊情况下,我有一个 XmlDocument 并且我需要拥有所有文本框节点的行号。由于我得到了与 MadSkunk 描述的相同的异常,我认为唯一的方法是创建一个 XPathDocument 实例并进行转换。
Richard Schneider 的回答帮助我将其形象化。所以我现在的方法是这样的:
public Dictionary<int, string> GetLineNumber()
Dictionary<int, string> attrByLineNumber = new Dictionary<int, string>();
MemoryStream xmlStream = new MemoryStream();
_xmlDoc.Save(xmlStream);
xmlStream.Position = 0;
XPathDocument pathDocument = new XPathDocument(xmlStream);
foreach (XPathNavigator element in pathDocument.CreateNavigator().Select("//*"))
if (element.Name.Equals("Textbox"))
attrByLineNumber.Add(((IXmlLineInfo)element).LineNumber, element.GetAttribute("Name", ""));
return attrByLineNumber;
【讨论】:
【参考方案2】:您可以使用IXmlLineInfo interface 执行此操作。
我知道使用XDocument
和XPathDocument
,您可以将一个节点强制转换为IXmlLineInfo
。我认为 XmlDocument 也可以。
【讨论】:
不,不能与 XmlDocument 一起使用IXmlLineInfo
仅在信息由底层XmlReader
设置时才有帮助。
正如约翰建议的那样,您需要您的XmlReader
来设置线路信息。您能否发布您如何阅读 XmlDocument。
我更新了我的问题:我没有使用 XmlReader。
谢谢,但我已经尝试过了。我得到Unable to cast object of type 'System.Xml.XmlElement' to type 'System.Xml.IXmlLineInfo'
...以上是关于使用 System.Xml.XmlDocument 时是不是可以从 System.Xml.XmlNode 获取行号/位置?的主要内容,如果未能解决你的问题,请参考以下文章