5

.SelectNodes(string xPath)を使用してクエリしたいさまざまな名前空間を持つxmlがあります

私が気付いた問題は、それらの名前空間がすべてある限り、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です!何か案が?

4

3 に答える 3

9

名前空間マネージャーを作成し、使用するすべての名前空間とそのプレフィックスを設定してから、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);

警告:私はこのコードをコンパイルしませんでした。

于 2010-01-16T01:06:26.293 に答える
2

私は.NETAPIに精通していませんが、任意の要素(例*)を照合しlocal-name、述語フィルターでを使用することにより、名前空間を無視するより一般的なXPATHを送信できる可能性があります。

たとえば、 ns名前空間を宣言せず/*[local-name()='foo']/*[local-name()='bar']/*[local-name()='baz'] に検索するために使用します。ns:foo/ns:bar/ns:baz

そうすれば、コンパイル時に特定の名前空間にバインドする必要がなく、任意のXPATHステートメントを渡すことができます。

明らかに、名前空間を認識しないXPATHステートメントを使用すると、意図しない結果が得られる可能性があり(同じ名前の要素を持つ名前空間コンテンツが混在している場合)、XPATHは非常に冗長です。

XPATH 2.0では、名前空間にワイルドカードを使用できます: 。ただし、.NETでXSLT / XPATH 2.0をサポートするには、Saxon/*:foo/*:bar/*:baz使用する必要があります。

于 2010-01-16T14:29:54.267 に答える
-1

ここの別の投稿で問題が見つかりました: XPathを使用してAtom XMLドキュメントからノードが選択されていませんか?

みんなありがとう。

于 2010-01-18T04:36:40.273 に答える