次の方法で共有


XPath 名前空間ナビゲーション

XML ドキュメントで XPath クエリを使用するには、XML 名前空間と名前空間に含まれる要素に正しく対処する必要があります。 名前空間は、複数のコンテキストで名前が使用されている場合に発生する可能性のあるあいまいさを防ぎます。たとえば、 ID 名前は、XML ドキュメントの異なる要素に関連付けられている複数の識別子を参照できます。 名前空間の構文では、XML ドキュメントの要素を区別する URI、名前、プレフィックスを指定します。

このトピックの例では、 XPathNavigatorを使用して XML ドキュメント内を移動する際にプレフィックスを使用する方法を示します。 名前空間と構文の詳細については、「 XML ファイル: XML 名前空間について」を参照してください。

名前空間の宣言

名前空間宣言を使用すると、 XPathNavigatorのインスタンスを使用するときに、XML ドキュメントの要素が識別可能でアドレス指定可能になります。 名前空間プレフィックスは、名前空間をアドレス指定するための簡単な構文を提供します。

プレフィックスは次の形式で定義されます。 <e:Envelope xmlns:e=http://schemas.xmlsoap.org/soap/envelope/>. この構文では、プレフィックス "e" は名前空間の正式な URI の省略形です。 Body要素は、Envelope構文を使用して、e:Body名前空間のメンバーとして識別できます。

次の XML ドキュメントは、次のセクションのナビゲーション例で response.xml として参照されます。

<?xml version="1.0" encoding="utf-8" ?>
<e:Envelope xmlns:e="http://schemas.xmlsoap.org/soap/envelope/">
  <e:Body>
    <s:Search xmlns:s="http://schemas.microsoft.com/v1/Search">
      <r:request xmlns:r="http://schemas.microsoft.com/v1/Search/metadata"
                 xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
      </r:request>
    </s:Search>
  </e:Body>
</e:Envelope>

このセクションのコードでは、 XPathNavigator オブジェクトと XmlNamespaceManager オブジェクトを使用して、前のセクションの XML ドキュメントから Search 要素を選択します。 クエリ xpath には、パス内の各要素の名前空間プレフィックスが含まれています。 各要素を含む名前空間の正確な ID を指定すると、Search メソッドによってSelectSingleNode要素への正しいナビゲーションが保証されます。

using (XmlReader reader = XmlReader.Create("response.xml"))
{
    XPathDocument doc = new XPathDocument(reader);
    XPathNavigator nav = doc.CreateNavigator();

    XmlNamespaceManager nsmgr = new XmlNamespaceManager(nav.NameTable);
    nsmgr.AddNamespace("e", @"http://schemas.xmlsoap.org/soap/envelope/");
    nsmgr.AddNamespace("s", @"http://schemas.microsoft.com/v1/Search");
    nsmgr.AddNamespace("r", @"http://schemas.microsoft.com/v1/Search/metadata");
    nsmgr.AddNamespace("i", @"http://www.w3.org/2001/XMLSchema-instance");

    string xpath = "/e:Envelope/e:Body/s:Search";

    XPathNavigator element = nav.SelectSingleNode(xpath, nsmgr);

    Console.WriteLine("Element Prefix:" + element.Prefix +
    " Local name:" + element.LocalName);
    Console.WriteLine("Namespace URI: " + element.NamespaceURI);
}

完全に修飾された名前空間と名前の精度は、利便性以上のものになります。 前の例のドキュメント定義やコードを少し試してみると、完全修飾要素名を使わないナビゲーションでは例外が発生することが確認できます。 たとえば、要素定義:<Search xmlns="http://schemas.microsoft.com/v1/Search">、およびクエリ: xpath = "/s:Envelope/s:Body/Search";要素の名前空間プレフィックスのない文字列Searchは、null要素の代わりにSearchを返します。

こちらも参照ください