У меня есть xml с различными пространствами имен, что я хотел бы запросить использование.SelectNodes (представьте xPath в виде строки),
Проблема, которую я замечаю, состоит в том, что запрос xPath ничего не возвращает, пока у меня есть все те пространства имен вокруг.
должен там так или иначе сказать XmlDocument. SelectNodes, чтобы проигнорировать те пространства имен и просто получить меня корректные элементы (элементы, которые я запрашиваю, кажется, не имеет префикс пространств имен)?
если существует, кто-либо может предоставить мне пример того, как сделать это? что должно, я определил, прежде чем/когда я запрашиваю узлы?
Спасибо за справку.
Исправление: я все еще не могу изобразить, какова проблема. вот мой 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! какая-либо идея?
Нашел проблему в другом поду здесь: Без узлов, выбранных из документа Atom XML, используя XPath?
Спасибо всем.
Вам необходимо создать менеджер пространства имен, установить все пространства имен, которые вы хотите использовать и их префикс, а затем в 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);
Предупреждение: я не скомпилировал этот код.
Я не такой знакомый с 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.