2011-04-12 27 views

Odpowiedz

8

Jedyna opcja wiem z jest XDocument.Load(), którego przeciążenia akceptują LoadOptions.SetLineInfo. Zostałoby to zużyte w bardzo podobny sposób jak XmlDocument.

Example

+0

Dla bieżącego .net byłoby świetnie, ale niestety wciąż piszę dla .net 2.0 z lat 80-tych. (Wspomniałem w pytaniu, ale nie chciałem umawiać się na randkę) –

+0

Myślałem, że tak być może. Pomiędzy tymi dwoma, myślę, że wolałbym podejście "XPathDocument". – dahlbyk

+3

Trzymaj z podejściem XmlDocument i spójrz na ten kod jako opakowanie: https://github.com/icsharpcode/SharpDevelop/blob/master/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/PositionXmlDocument.cs – Andy

5

(Rozszerzanie odpowiedź od @ komentarzu Andy'ego)

Tam nie jest zbudowany w sposób to zrobić przy użyciu XmlDocument (jeśli używasz XDocument, można użyć przeciążenie XDocument.Load() który akceptuje LoadOptions.SetLineInfo - zobacz this question).

Chociaż nie ma wbudowanego sposób można użyć klasy PositionXmlDocument otoki stąd (z projektu SharpDevelop):

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

Aby go wykorzystać, trzeba będzie użyć Load przeciążenie, które akceptuje przeciążenie XmlReader (pozostałe przeciążenia Load przejdą do zwykłej klasy XmlDocument, która nie daje informacji o numerze linii). Jeśli używasz przeciążenie XmlDocument.Load który akceptuje nazwę pliku, trzeba będzie zmienić kod w następujący sposób:

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

Teraz powinieneś być w stanie rzucić żadnego XmlNode z tego dokumentu do PositionXmlElement aby pobrać numer wiersza i kolumna:

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

To jest naprawdę dobre dla dodania retrospectivley - napisałem dużo kodu na podstawie XmlDocument, i po prostu dodając ten plik, a następnie dodając 3 linie kodu sugerowane, że jestem w stanie uzyskać przydatne informacje o położeniu użytkownika:) ... potrzebujesz dodać 'using ICSharpCode.WpfDesign.XamlDom;' - to prawdopodobnie oślepiająco oczywiste dla użytkowników C#, ale jestem nowy w C#: o ... +1! –

Powiązane problemy