4

XMLドキュメントをロードしましたが、XPathクエリを実行してXMLの特定のサブセットを選択したいと思います。XMLは

<?xml version="1.0"?>
<catalog xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications with
      XML.</description>
   </book>
</catalog>

手順は次のようになります

procedure RunXPathQuery(XML: IXMLDOMDocument2; Query: string);
begin

  XML.setProperty('SelectionLanguage', 'XPath');

  NodeListResult := XML.documentElement.selectNodes(Query));

  ShowMessage('Found (' + IntToStr(NodeListResult.length) + ') nodes.');

end;

問題は、上記のXMLに対してXPathクエリ'/ catalog'を実行すると、(予想どおりに)1要素のノードリストが返されることです。ただし、クエリを削除:xsi<catalog xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>て再実行すると、返されるノードリストは空になります。'xmlns'属性全体を削除すると、結果のノードリストにはもう一度1つの要素が含まれます。

だから私の質問はこれです:これを修正するために何ができますか?つまり、名前空間(または他の属性)に関係なく、MSXMLに正しい数のインスタンスを返すようにするにはどうすればよいですか(XPathクエリを実行するとき)?

ありがとう!

4

4 に答える 4

3

このリンクを参照してください!

を使用する<catalog xmlns='http://www.w3.org/2001/XMLSchema-instance'>と、ノード全体が別の(デフォルトの)名前空間に移動されます。XPathはこの他の名前空間の内部を調べていないため、データを見つけることができません。これ<catalog xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>で、xsiを別の名前空間として宣言しているだけです。これは、デフォルトの名前空間とは異なる名前空間になります。

現在テストすることはできませんが、次のようなものを追加すると役立つ場合があります。

XML.setProperty('SelectionNamespaces', 'xmlns=''http://www.w3.org/2001/XMLSchema-instance''');

または多分そうではありません。私が言ったように、私は今それをテストすることができません。

于 2009-10-05T11:14:49.557 に答える
2

理解した。私の問題はここここで説明されているようです(そしておそらく他の無数の場所も)。

クエリ/*[local-name()='catalog']は私のために働きます。

于 2009-10-05T13:35:16.440 に答える
1

使用する:

document.setProperty('SelectionNamespaces', 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
于 2009-10-05T11:17:10.203 に答える
0
/*[local-name()='catalog'] 

あなたの質問に対する解決策です。しかし、なぜ名前空間を無視したいのでしょうか?それらは、たとえば、さまざまなタイプのカタログを区別するために、何かを表現するために導入されました。クエリを使用すると、世界中の任意のカタログのコンテンツを選択できるようになりますが、処理できるのは本だけだと思います。代わりにネジや車のカタログを入手するとどうなりますか?

プレフィックス(xsi)について述べたことが正しいです。プレフィックスを削除すると、すべての要素がその名前空間に含まれます(デフォルトの名前空間と呼ばれます)。しかし、あなたはまだそれに対処することができます。

コードでは、とにかく名前空間にプレフィックスを付けます。元のプレフィックスと一致する必要はありません。

XML.setProperty('SelectionNamespaces', "xmlns:xyz='http://www.w3.org/2001/XMLSchema-instance'"); 

2つ目は、XPathクエリを適応させることです。それなら

/xyz:catalog

元のXMLはxsi名前空間を宣言するだけで、それを使用することはありません。この場合、完全に削除できます。名前空間を使用し、プレフィックスを付けて使用する場合は、XMLを次のように書き直します。

<?xml version="1.0"?>
<xsi:catalog xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
  <xsi:book id="bk101">
    <xsi:author>Gambardella, Matthew</xsi:author>
    <xsi:title>XML Developer's Guide</xsi:title>
    <xsi:genre>Computer</xsi:genre>
    <xsi:price>44.95</xsi:price>
    <xsi:publish_date>2000-10-01</xsi:publish_date>  
    <xsi:description>An in-depth look at creating applications with 
    XML.</xsi:description>
 </xsi:book>
</xsi:catalog>
于 2011-11-17T08:21:42.633 に答える