Как запросить элемент xml с помощью xpath с существующим пространством имен - PullRequest
1 голос
/ 30 сентября 2011
<?xml version="1.0" encoding="utf-8"?> 
<Report p1:schemaLocation="TemplateXXX http://localhost?language=en" Name="TemplateXXX" xmlns:p1="http://www.w3.org/2001/XMLSchema-instance" xmlns="TemplateXXX"> 
   <HEADER attr1="one" attr2="two" /> 
   <Table filename="12345.pdf"> 
      <left> 
         <details> 
            <item/> 
            <item/> 
         </details> 
      </left> 
      <right> 
         <details> 
            <item/> 
            <item/> 
         </details> 
      </right> 
   </Table> 
</Report> 

Я сталкиваюсь со странной проблемой при попытке запросить элементы и атрибуты в документе XML, где пространство имен находится в XML.

Когда я пытаюсь запросить документ, чтобы получить заголовокэлемент со следующим запросом xpath Я постоянно получаю нулевые результаты

XDocument root = XDocument.Load(filePath);
var element = root.XPathSelectElement("/Report/HEADER");

Это всегда возвращает ноль, однако в момент удаления пространства имен из документа запрос возвращает исключенный элемент.

Что это такоечто я ошибаюсь, потому что получаю разочарование.

edit: обновленный xml до действительного xml

1 Ответ

2 голосов
/ 30 сентября 2011

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

using System;
using System.Xml;
using System.Xml.Linq;
using System.Xml.XPath;

class Test
{
    static void Main()
    {
        var doc = XDocument.Load("test.xml");
        var manager = new XmlNamespaceManager(new NameTable());
        manager.AddNamespace("foo", "TemplateXXX");

        var query = doc.XPathSelectElement("/foo:Report/foo:HEADER", manager);
        Console.WriteLine(query);
    }
}

В обычном запросе LINQ to XML вы просто используете:

XNamespace ns = "TemplateXXX";
XElement header = doc.RootElement.Element(ns + "HEADER");

Нет необходимости в менеджере пространства имен и т. Д.

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