XPath для XML с пространством имен

У меня есть xml с различными пространствами имен, что я хотел бы запросить использование.SelectNodes (представьте xPath в виде строки),

Проблема, которую я замечаю, состоит в том, что запрос xPath ничего не возвращает, пока у меня есть все те пространства имен вокруг.

  1. должен там так или иначе сказать XmlDocument. SelectNodes, чтобы проигнорировать те пространства имен и просто получить меня корректные элементы (элементы, которые я запрашиваю, кажется, не имеет префикс пространств имен)?

  2. если существует, кто-либо может предоставить мне пример того, как сделать это? что должно, я определил, прежде чем/когда я запрашиваю узлы?

Спасибо за справку.

Исправление: я все еще не могу изобразить, какова проблема. вот мой xml:

<feed xmlns="http://www.w3.org/2005/Atom"  xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/"  xmlns:gf="http://schemas.google.com/finance/2007"  
      xmlns:gd="http://schemas.google.com/g/2005" >
  <id>http://finance.google.com/finance/feeds/xyx@google.com/portfolios</id>
  <updated>2009-12-15T19:32:21.000Z</updated>
  <category scheme="http://schemas.google.com/g/2005#kind"  term="http://schemas.google.com/finance/2007#portfolio" />
  <title type="text" >Portfolio Feed</title>
  <link rel="alternate"  type="text/html"  href="http://finance.google.com/finance/portfolio?action=view" />
  <link rel="http://schemas.google.com/g/2005#feed"  type="application/atom+xml"  href="http://finance.google.com/finance/feeds/default/portfolios" />
  <link rel="http://schemas.google.com/g/2005#post"  type="application/atom+xml"  href="http://finance.google.com/finance/feeds/default/portfolios" />
  <link rel="self"  type="application/atom+xml"  href="http://finance.google.com/finance/feeds/default/portfolios" />
  <openSearch:totalResults>24</openSearch:totalResults>
  <openSearch:startIndex>1</openSearch:startIndex>
  <openSearch:itemsPerPage>24</openSearch:itemsPerPage>
  <entry>
    <id>http://finance.google.com/finance/feeds/xyx@google.com/portfolios/2</id>
    <updated>2009-12-14T16:26:53.000Z</updated>
    <category scheme="http://schemas.google.com/g/2005#kind"  term="http://schemas.google.com/finance/2007#portfolio" />
    <title type="text" >Main</title>
    <link rel="self"  type="application/atom+xml"  href="http://finance.google.com/finance/feeds/default/portfolios/2" />
    <link rel="edit"  type="application/atom+xml"  href="http://finance.google.com/finance/feeds/default/portfolios/2" />
    <gd:feedLink href="http://finance.google.com/finance/feeds/xyx@google.com/portfolios/2/positions" />
    <gf:portfolioData currencyCode="USD"  gainPercentage="0.0"  return1w="0.0"  return1y="0.0"  return3m="0.0"  return3y="0.0"  return4w="0.0"  return5y="0.0"  returnOverall="0.0"  returnYTD="0.0" />
  </entry>
</feed>

и вот мой код:

XmlDocument xml = ExecuteRequest (URL);

        var xmlnsManager = new System.Xml.XmlNamespaceManager(xml.NameTable);
        xmlnsManager.AddNamespace("xmlns:openSearch", "http://a9.com/-/spec/opensearchrss/1.0/");
        xmlnsManager.AddNamespace("xmlns:gf", "http://schemas.google.com/finance/2007");
        xmlnsManager.AddNamespace("xmlns:gd", "http://schemas.google.com/g/2005");

        var nodes = xml.SelectNodes("//feed/entry", xmlnsManager);

и мое количество узлов все еще 0! какая-либо идея?

5
задан Or A 18 January 2010 в 03:36
поделиться

3 ответа

Нашел проблему в другом поду здесь: Без узлов, выбранных из документа Atom XML, используя XPath?

Спасибо всем.

-1
ответ дан 13 December 2019 в 22:08
поделиться

Вам необходимо создать менеджер пространства имен, установить все пространства имен, которые вы хотите использовать и их префикс, а затем в XPath, вам нужно использовать префикс.

var doc = new XmlDocument(); 
doc.Load("myfile.xml");

var xmlnsManager = new System.Xml.XmlNamespaceManager(doc.NameTable);
xmlnsManager.AddNamespace("ns", "http://example.org/schema.xsd");

doc.SelectNodes("//ns:MyElement",xmlnsManager);

Предупреждение: я не скомпилировал этот код.

9
ответ дан 13 December 2019 в 22:08
поделиться

Я не такой знакомый с API .NET, но вы сможете отправить более общего XPath, который игнорирует пространства имен, сопоставив на любом элементе (например, * ) И использование местного имени в фильтрах предикатов.

E.G. Использование / * [local-name () = 'foo'] / * [local-name () = 'bar'] / * [local-name () = 'baz'] Найти NS: FOO / NS: BAR / NS: BAZ без объявления пространства имен NS .

Таким образом, вам не нужно связываться с определенным пространством имен при компиляционном времени, и может пройти в арбитрах операторах XPath.

Очевидно, что с помощью операторов NameSpace - NOWARE XPath, вы можете получить непреднамеренные результаты (если есть смешанное содержание пространства имен с элементами одного и того же имени), и XPath действительно Verbose.

В XPath 2.0 Вы можете использовать подстановочные знаки для пространства имен: / *: FOO / *: BAR / *: BAZ , но вам придется использовать Saxon Чтобы получить XSLT / XPath 2.0 поддержка в .NET.

2
ответ дан 13 December 2019 в 22:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: