2011-04-12 30 views

回答

8

我所知道的唯一的其他选择是XDocument.Load(),其超载接受LoadOptions.SetLineInfo。这将以与XmlDocument几乎相同的方式消耗。

Example

+0

对于目前的.net,这将是伟大的..但不幸的是,我仍然写作为80年代的.net 2.0。 (我会提到的问题,但我不想约会的帖子) – 2011-04-12 23:38:02

+0

我认为可能是这种情况。在另外两个之间,我想我更喜欢'XPathDocument'方法。 – dahlbyk 2011-04-13 12:49:46

+3

坚持使用XmlDocument方法,并将此代码视为包装:https://github.com/icsharpcode/SharpDevelop/blob/master/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/PositionXmlDocument.cs – Andy 2014-07-03 15:10:43

5

(扩大从@小宝的评论答案)

没有内置的方式做到这一点使用XmlDocument(如果你使用XDocument,则可以使用XDocument.Load()过载,它接受LoadOptions.SetLineInfo - 见this question)。

虽然没有内置的方式,你可以使用PositionXmlDocument包装类从这里(从SharpDevelop项目):

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

为了使用它,你将需要使用Load超载,接受XmlReader(其他Load重载将转到正常的XmlDocument类,这不会给你线路号码信息)。如果您当前使用的XmlDocument.Load重载接受一个文件名,你就需要改变你的代码如下:

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

现在,你应该能够从本文档中施放任何XmlNodePositionXmlElement检索行号和列:

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

这对添加retrospectivley非常有用 - 我已经写了很多基于XmlDocument的代码,并且只需添加此文件,然后添加3行代码就可以获得有用的位置用户反馈:)...您需要添加'使用ICSharpCode.WpfDesign.XamlDom;' - 这可能对C#用户非常明显,但我对C#是新手:o ... +1! – 2016-10-17 15:17:17