как использовать XPath с XDocument? - PullRequest
105 голосов
/ 02 июня 2011

Есть похожий вопрос, но, похоже, решение не сработало в моем случае: Странность с XDocument, XPath и пространствами имен

Вот XML, с которым я работаюс:

<?xml version="1.0" encoding="utf-8"?>
<Report Id="ID1" Type="Demo Report" Created="2011-01-01T01:01:01+11:00" Culture="en" xmlns="http://demo.com/2011/demo-schema">
    <ReportInfo>
        <Name>Demo Report</Name>
        <CreatedBy>Unit Test</CreatedBy>
    </ReportInfo>
</Report>

Ниже приведен код, который, как я думал, должен работать, но он не ...

XDocument xdoc = XDocument.Load(@"C:\SampleXML.xml");
XmlNamespaceManager xnm = new XmlNamespaceManager(new NameTable()); 
xnm.AddNamespace(String.Empty, "http://demo.com/2011/demo-schema");
Console.WriteLine(xdoc.XPathSelectElement("/Report/ReportInfo/Name", xnm) == null);

У кого-нибудь есть идеи?Спасибо.

Ответы [ 3 ]

151 голосов
/ 02 июня 2011

Если у вас есть XDocument, проще использовать LINQ-to-XML:

var document = XDocument.Load(fileName);
var name = document.Descendants(XName.Get("Name", @"http://demo.com/2011/demo-schema")).First().Value;

Если вы уверены, что XPath - единственное решение, которое вам нужно:

using System.Xml.XPath;

var document = XDocument.Load(fileName);
var namespaceManager = new XmlNamespaceManager(new NameTable());
namespaceManager.AddNamespace("empty", "http://demo.com/2011/demo-schema");
var name = document.XPathSelectElement("/empty:Report/empty:ReportInfo/empty:Name", namespaceManager).Value;
6 голосов
/ 02 июня 2011

XPath 1.0, который реализует MS, не имеет представления о пространстве имен по умолчанию.Так что попробуйте:

XDocument xdoc = XDocument.Load(@"C:\SampleXML.xml");
XmlNamespaceManager xnm = new XmlNamespaceManager(new NameTable()); 
xnm.AddNamespace("x", "http://demo.com/2011/demo-schema");
Console.WriteLine(xdoc.XPathSelectElement("/x:Report/x:ReportInfo/x:Name", xnm) == null);
2 голосов
/ 15 января 2019

вы можете использовать пример из Microsoft - для вас без пространства имен:

var e = xdoc.XPathSelectElement("./Report/ReportInfo/Name");     

должно сделать это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...