Share via


Naamruimten verwerken in XQuery

van toepassing op:SQL Server-

Dit onderwerp bevat voorbeelden voor het verwerken van naamruimten in query's.

Voorbeelden

Een. Een naamruimte declareren

Met de volgende query worden de productiestappen van een specifiek productmodel opgehaald.

SELECT Instructions.query('  
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
        /AWMI:root/AWMI:Location[1]/AWMI:step  
    ') as x  
FROM Production.ProductModel  
WHERE ProductModelID=7  

Dit is het gedeeltelijke resultaat:

<AWMI:step xmlns:AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions">Insert <AWMI:material>aluminum sheet MS-2341</AWMI:material> into the <AWMI:tool>T-85A framing tool</AWMI:tool>. </AWMI:step>  
...  

Houd er rekening mee dat de naamruimte trefwoord wordt gebruikt om een nieuw voorvoegsel voor de naamruimte 'AWMI:' te definiëren. Dit voorvoegsel moet vervolgens worden gebruikt in de query voor alle elementen die binnen het bereik van die naamruimte vallen.

B. Een standaardnaamruimte declareren

In de vorige query is een nieuw voorvoegsel voor de naamruimte gedefinieerd. Dat voorvoegsel moest vervolgens in de query worden gebruikt om de beoogde XML-structuren te selecteren. U kunt ook een naamruimte declareren als de standaardnaamruimte, zoals wordt weergegeven in de volgende gewijzigde query:

SELECT Instructions.query('  
     declare default element namespace "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
        /root/Location[1]/step  
    ') as x  
FROM Production.ProductModel  
where ProductModelID=7  

Dit is het resultaat

<step xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions">Insert <material>aluminum sheet MS-2341</material> into the <tool>T-85A framing tool</tool>. </step>  
...  

In dit voorbeeld wordt de naamruimte die is gedefinieerd, "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions", gemaakt om de standaardnaamruimte of lege naamruimte te overschrijven. Daarom hebt u geen naamruimtevoorvoegsel meer in de padexpressie die wordt gebruikt om een query uit te voeren. U hebt ook geen naamruimtevoorvoegsel meer in de elementnamen die in de resultaten worden weergegeven. Daarnaast wordt de standaardnaamruimte toegepast op alle elementen, maar niet op hun kenmerken.

C. Naamruimten gebruiken in XML-constructie

Wanneer u nieuwe naamruimten definieert, worden deze niet alleen binnen het bereik gebracht voor de query, maar voor de constructie. Bij het maken van XML kunt u bijvoorbeeld een nieuwe naamruimte definiëren met behulp van de declaratie 'declare namespace ...' en vervolgens die naamruimte gebruiken met alle elementen en kenmerken die u maakt om in de queryresultaten weer te geven.

SELECT CatalogDescription.query('  
     declare default element namespace "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
     declare namespace myNS="uri:SomeNamespace";<myNS:Result>  
          { /ProductDescription/Summary }  
       </myNS:Result>  
  
    ') as Result  
FROM Production.ProductModel  
where ProductModelID=19  

Dit is het resultaat:

  
      <myNS:Result xmlns:myNS="uri:SomeNamespace">  
  <Summary xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">  
   <p1:p xmlns:p1="http://www.w3.org/1999/xhtml">  
     Our top-of-the-line competition mountain bike. Performance-enhancing   
     options include the innovative HL Frame, super-smooth front   
     suspension, and traction for all terrain.</p1:p>  
  </Summary>  
</myNS:Result>  

U kunt ook de naamruimte expliciet definiëren op elk punt waar deze wordt gebruikt als onderdeel van de XML-constructie, zoals wordt weergegeven in de volgende query:

SELECT CatalogDescription.query('  
     declare default element namespace "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
       <myNS:Result xmlns:myNS="uri:SomeNamespace">  
          { /ProductDescription/Summary }  
       </myNS:Result>  
    ') as Result  
FROM Production.ProductModel  
where ProductModelID=19  

D. Constructie met behulp van standaardnaamruimten

U kunt ook een standaardnaamruimte definiëren voor gebruik in samengestelde XML. In de volgende query ziet u bijvoorbeeld hoe u een standaardnaamruimte , 'uri:SomeNamespace'\, kunt opgeven om te gebruiken als de standaardwaarde voor de lokaal benoemde elementen die zijn samengesteld, zoals het <Result>-element.

SELECT CatalogDescription.query('  
      declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
      declare default element namespace "uri:SomeNamespace";<Result>  
          { /PD:ProductDescription/PD:Summary }  
       </Result>  
  
    ') as Result  
FROM Production.ProductModel  
where ProductModelID=19  

Dit is het resultaat:

  
      <Result xmlns="uri:SomeNamespace">  
  <PD:Summary xmlns:PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">  
   <p1:p xmlns:p1="http://www.w3.org/1999/xhtml">  
         Our top-of-the-line competition mountain bike. Performance-  
         enhancing options include the innovative HL Frame, super-smooth   
         front suspension, and traction for all terrain.</p1:p>  
  </PD:Summary>  
</Result>  

Houd er rekening mee dat door de standaardnaamruimte of lege naamruimte te overschrijven, alle lokaal benoemde elementen in de samengestelde XML vervolgens afhankelijk zijn van de overschrijvende standaardnaamruimte. Als u daarom flexibiliteit nodig hebt bij het maken van XML om te profiteren van de lege naamruimte, moet u de standaardnaamruimte van het element niet overschrijven.

Zie ook

naamruimten toevoegen aan query's met XMLNAMESPACES-
XML-gegevens (SQL Server)
XQuery Language Reference (SQL Server)