2016-12-15 4 views
0

Я хочу выбрать узлы XML-документа с помощью XPath. Но это не работает, когда XML-документ содержит пространства имен xml. Как я могу найти узлы с XPath с учетом пространств имен?Выберите узлы с XPath, когда XML-документ содержит пространства имен

Это мой XML Document (упрощенно):

<ComponentSettings xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Company.Product.Components.Model"> 
    <Created xmlns="http://schemas.datacontract.org/2004/07/Company.Configuration">2016-12-14T10:29:28.5614696+01:00</Created> 
    <LastLoaded i:nil="true" xmlns="http://schemas.datacontract.org/2004/07/Company.Configuration" /> 
    <LastSaved xmlns="http://schemas.datacontract.org/2004/07/Company.Configuration">2016-12-14T16:31:37.876987+01:00</LastSaved> 
    <RemoteTracer> 
    <TraceListener> 
     <Key>f987d7bb-9dea-49b4-a689-88c4452d98e3</Key> 
     <Url>http://192.168.56.1:9343/</Url> 
    </TraceListener> 
    </RemoteTracer> 
</ComponentSettings> 

Я хочу, чтобы получить все Url теги в TraceListener теге RemoteTracer тега. Это, как я получить их, но это только работу, если документ XML не использовать пространство имен:

componentConfigXmlDocument = new XmlDocument(); 
componentConfigXmlDocument.LoadXml(myXmlDocumentCode); 
var remoteTracers = componentConfigXmlDocument.SelectNodes("//RemoteTracer/TraceListener/Url"); 

В настоящее время мой обходной путь, чтобы удалить все пространства имен из необработанного строки XML с использованием регулярных выражений, перед загрузкой XML. Тогда мой SelectNodes() работает отлично. Но это не правильное решение.

+0

Возможный дубликат [Использование Xpath С умолчанию пространство имен в C#] (HTTP: // StackOverflow .com/questions/585812/using-xpath-with-default-namespace-in-c-sharp) –

+0

На этот вопрос в StackOverflow есть 1000 ответов. –

ответ

1

У вас есть два пространства имен. Во-первых это

http://schemas.datacontract.org/2004/07/Company.Product.Components.Model 

Корневой элемент (ComponentSettings), RemoteTracer и все под ним принадлежат этому пространству имен. Второе пространство имен

http://schemas.datacontract.org/2004/07/Company.Configuration 

Created, LastLoaded и Saved принадлежат ему.

Чтобы получить нужный вам узел, вы должны префикс всех элементов вашего запроса xpath с их соответствующими префиксами пространства имен. Сопоставление этих префиксов в реальных пространств имен вы можете сделать так:

var componentConfigXmlDocument = new XmlDocument();    
componentConfigXmlDocument.LoadXml(File.ReadAllText(@"G:\tmp\xml.txt")); 
var ns = new XmlNamespaceManager(componentConfigXmlDocument.NameTable); 
ns.AddNamespace("model", "http://schemas.datacontract.org/2004/07/Company.Product.Components.Model"); 
ns.AddNamespace("config", "http://schemas.datacontract.org/2004/07/Company.Configuration"); 

И затем запрос, как это:

var remoteTracers = componentConfigXmlDocument.SelectNodes("//model:RemoteTracer/model:TraceListener/model:Url", ns); 
+0

Спасибо, что работает. Я пробовал много и искал примеры, которые соответствовали моей исходной ситуации, но я не нашел находки. Но это работает. Благодаря! – rittergig

Смежные вопросы