Navigazione dello spazio dei nomi XPathXPath Namespace Navigation

Per usare le query XPath con i documenti XML, è necessario indirizzare correttamente gli spazi dei nomi XML e gli elementi da questi contenuti.To use XPath queries with XML documents, you have to correctly address XML namespaces and the elements contained by namespaces. Gli spazi dei nomi evitano le ambiguità che si possono verificare quando i nomi vengono usati in più contesti; ad esempio il nome ID potrebbe far riferimento a più identificatori associati a diversi elementi di un documento XML.Namespaces prevent ambiguities that can occur when names are used in more than one context; for example, the name ID may refer to more than one identifier associated with different elements of an XML document. La sintassi dello spazio dei nomi specifica gli URI, i nomi e i prefissi che distinguono gli elementi di un documento XML.Namespace syntax specifies URIs, names, and prefixes that distinguish the elements of an XML document.

Nell'esempio di questo argomento viene illustrato l'uso di prefissi nella navigazione di un documento XML con l'oggetto XPathNavigator.The example in this topic demonstrates the use of prefixes in navigating an XML document with XPathNavigator. Per altre informazioni sugli spazi dei nomi e sulla sintassi, vedere Understanding XML Namespaces.For more information about namespaces and syntax, see Understanding XML Namespaces.

Dichiarazioni dello spazio dei nomiNamespace Declarations

Le dichiarazioni dello spazio dei nomi consentono di distinguere e indirizzare gli elementi di un documento XML quando si usa un'istanza dell'oggetto XPathNavigator.Namespace declarations make the elements of an XML document distinguishable and addressable when using an instance of XPathNavigator. I prefissi dello spazio dei nomi forniscono una breve sintassi per l'indirizzamento degli spazi dei nomi.Namespace prefixes provide a brief syntax for addressing namespaces.

I prefissi sono definiti dal formato: <e:Envelope xmlns:e=http://schemas.xmlsoap.org/soap/envelope/>. In questa sintassi il prefisso "e" è un'abbreviazione dell'URI formale dello spazio dei nomi.Prefixes are defined by the form: <e:Envelope xmlns:e=http://schemas.xmlsoap.org/soap/envelope/>. In this syntax the prefix "e" is an abbreviation for the formal URI of the namespace. È possibile identificare l'elemento Body come membro dello spazio dei nomi Envelope tramite la sintassi: e:Body.You can identify the Body element as a member of the Envelope namespace by using the syntax: e:Body.

Nell'esempio di navigazione della sezione successiva, al seguente documento XML verrà fatto riferimento come response.xml.The following XML document will be referenced as response.xml in the navigation example in the next section.

<?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>  

Nel codice di questa sezione vengono usati gli oggetti XPathNavigator e XmlNamespaceManager per selezionare l'elemento Search dal documento XML della sezione precedente.The code in this section uses XPathNavigator and XmlNamespaceManager objects to select the Search element from the XML document in the previous section. La query xpath include i prefissi dello spazio dei nomi in ogni elemento del percorso.The query xpath includes namespace prefixes on each element in the path. Specificando l'esatta identità degli spazi dei nomi che contengono ogni elemento è possibile garantire la corretta navigazione all'elemento Search tramite il metodo SelectSingleNode.Specifying the precise identity of the namespaces that contain each element assures correct navigation to the Search element by the SelectSingleNode method.

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);  

            }  

La precisione assicurata dalla qualifica completa degli spazi dei nomi e dei nomi non è soltanto utile,The precision of fully qualifying namespaces and names is more than a convenience. infatti da un breve esperimento con la definizione di documento e il codice degli esempi precedenti è possibile constatare che la navigazione senza nomi di elementi completi genera eccezioni.A little experimentation with the document definition and code in the previous examples will verify that navigation without fully qualified element names throws exceptions. Ad esempio la definizione di elemento: <Search xmlns="http://schemas.microsoft.com/v1/Search"> e la query: stringa xpath = "/s:Envelope/s:Body/Search"; senza il prefisso dello spazio dei nomi nell'elemento Search restituisce null invece dell'elemento Search.For example, the element definition: <Search xmlns="http://schemas.microsoft.com/v1/Search">, and query: string xpath = "/s:Envelope/s:Body/Search"; without the namespace prefix on the Search element returns null instead of the Search element.

Vedere ancheSee Also

Accesso ai dati XML con XPathNavigatorAccessing XML Data using XPathNavigator
Selezione, valutazione e corrispondenza di dati XML con XPathNavigatorSelecting, Evaluating and Matching XML Data using XPathNavigator