Dela via


Åtkomst till starkt typerade XML-data med XPathNavigator

Som en instans av XPath 2.0-datamodellen XPathNavigator kan klassen innehålla starkt skrivna data som mappar till clr-typer (common language runtime). Enligt XPath 2.0-datamodellen kan endast element och attribut innehålla starkt skrivna data. Klassen XPathNavigator innehåller mekanismer för att komma åt data i ett XPathDocument objekt eller XmlDocument ett objekt som är starkt inskrivna data samt mekanismer för att konvertera från en datatyp till en annan.

Skriv information som exponeras av XPathNavigator

XML 1.0-data är tekniskt sett utan typ, såvida de inte bearbetas med ett DTD-, XML-schemadefinitionsspråk (XSD) eller någon annan mekanism. Det finns ett antal kategorier av typinformation som kan associeras med ett XML-element eller -attribut.

  • Enkla CLR-typer: Inget av XML-schemaspråken stöder CLR-typer (Common Language Runtime) direkt. Eftersom det är användbart att kunna visa enkelt element och attributinnehåll som den lämpligaste CLR-typen, kan allt enkelt innehåll skrivas som i avsaknad av schemainformation med eventuell tillagd schemainformation som String potentiellt förfinar innehållet till en lämpligare typ. Du hittar den bästa matchande CLR-typen av enkelt element och attributinnehåll med hjälp ValueType av egenskapen . Mer information om mappningen från inbyggda schematyper till CLR-typer finns i Typstöd i System.Xml-klasserna.

  • Listor med enkla (CLR)-typer: Ett element eller attribut med enkelt innehåll kan innehålla en lista med värden avgränsade med blanksteg. Värdena anges av ett XML-schema som en "listtyp". I avsaknad av ett XML-schema skulle sådant enkelt innehåll behandlas som en enda textnod. När ett XML-schema är tillgängligt kan det här enkla innehållet exponeras som en serie atomiska värden som var och en har en enkel typ som mappar till en samling CLR-objekt. Mer information om mappningen från inbyggda schematyper till CLR-typer finns i Typstöd i System.Xml-klasserna.

  • Typat värde: Ett schema-verifierat attribut eller element med en enkel typ har ett skrivet värde. Det här värdet är en primitiv typ, till exempel en numerisk typ, sträng eller datumtyp. Alla inbyggda enkla typer i XSD kan mappas till CLR-typer som ger åtkomst till värdet för en nod som en lämpligare typ i stället för bara som en String. Ett element med attribut eller element underordnade anses vara en komplex typ. Det inskrivna värdet för en komplex typ med enkelt innehåll (endast textnoder som underordnade) är detsamma som för den enkla typen av innehåll. Det inskrivna värdet för en komplex typ med komplext innehåll (ett eller flera underordnade element) är strängvärdet för sammanfogningen av alla underordnade textnoder som returneras som en String. Mer information om mappningen från inbyggda schematyper till CLR-typer finns i Typstöd i System.Xml-klasserna.

  • Schemaspecifikt typnamn: I de flesta fall används CLR-typerna, som anges som en bieffekt av att tillämpa ett externt schema, för att ge åtkomst till värdet för en nod. Det kan dock finnas situationer där du kanske vill undersöka vilken typ som är associerad med ett visst schema som tillämpas på ett XML-dokument. Du kanske till exempel vill söka igenom ett XML-dokument och extrahera alla element som är fast beslutna att ha innehåll av typen "PurchaseOrder" enligt ett bifogat schema. Sådan typinformation kan bara anges som ett resultat av schemavalidering och den här informationen nås via XmlType klassens egenskaper XPathNavigator ochSchemaInfo. Mer information finns i avsnittet PSVI (Post Schema Validation Infoset) nedan.

  • Schemaspecifik typreflektion: I andra fall kanske du vill få ytterligare information om den schemaspecifika typ som tillämpas på ett XML-dokument. När du till exempel läser en XML-fil kanske du vill extrahera maxOccurs attributet för varje giltig nod i XML-dokumentet för att utföra en anpassad beräkning. Eftersom den här informationen endast anges via schemaverifiering, nås den SchemaInfo via -egenskapen för XPathNavigator klassen. Mer information finns i avsnittet PSVI (Post Schema Validation Infoset) nedan.

XPathNavigator-typade accessorer

I följande tabell visas de olika egenskaperna och metoderna för klassen XPathNavigator som kan användas för att komma åt typinformationen om en nod.

Property beskrivning
XmlType Detta innehåller information om XML-schematyp för noden om den är giltig.
SchemaInfo Det här innehåller postschemats valideringsinformation för noden som läggs till efter valideringen. Detta inkluderar information om XML-schematyp samt giltighetsinformation.
ValueType CLR-typen för nodens typerade värde.
TypedValue Innehållet i noden som ett eller flera CLR-värden vars typ är den närmaste matchningen till nodens XML-schematyp.
ValueAsBoolean Värdet String för den aktuella noden som castas till ett Boolean värde, enligt XPath 2.0-gjutningsreglerna för xs:boolean.
ValueAsDateTime Värdet String för den aktuella noden som castas till ett DateTime värde, enligt XPath 2.0-gjutningsreglerna för xs:datetime.
ValueAsDouble Värdet String för den aktuella noden som castas till ett Double värde, enligt XPath 2.0-gjutningsreglerna för xsd:double.
ValueAsInt Värdet String för den aktuella noden som castas till ett Int32 värde, enligt XPath 2.0-gjutningsreglerna för xs:integer.
ValueAsLong Värdet String för den aktuella noden som castas till ett Int64 värde, enligt XPath 2.0-gjutningsreglerna för xs:integer.
ValueAs Innehållet i noden som castas till måltypen enligt reglerna för XPath 2.0-gjutning.

Mer information om mappningen från inbyggda schematyper till CLR-typer finns i Typstöd i System.Xml-klasserna.

Post Schema Validation Infoset (PSVI)

En XML-schemaprocessor accepterar en XML-informationsuppsättning som indata och konverterar den till en PSVI (Post Schema Validation Infoset). En PSVI är den ursprungliga XML-informationsuppsättningen för indata med nya informationsobjekt som har lagts till och nya egenskaper har lagts till i befintliga informationsobjekt. Det finns tre breda informationsklasser som läggs till i XML-infouppsättningen i PSVI som exponeras av XPathNavigator.

  1. Valideringsresultat: Information om huruvida ett element eller attribut har verifierats eller inte. Detta exponeras av Validity egenskapen för SchemaInfo egenskapen för XPathNavigator klassen.

  2. Standardinformation: Indikationer på om värdet för elementet eller attributet erhölls via standardvärden som anges i schemat eller inte. Detta exponeras av IsDefault egenskapen för SchemaInfo egenskapen för XPathNavigator klassen.

  3. Skriv anteckningar: Referenser till schemakomponenter som kan vara typdefinitioner eller element- och attributdeklarationer. Egenskapen XmlType för XPathNavigator innehåller den specifika typinformationen för noden om den är giltig. Om en nods giltighet är okänd, till exempel när den verifierades, redigerades den senare. sedan är egenskapen XmlType inställd på null men typinformation är fortfarande tillgänglig från de olika egenskaperna för SchemaInfo egenskapen för XPathNavigator klassen.

I följande exempel visas hur du använder information i den postschemavalideringsinformation som exponeras av XPathNavigator.

Dim settings As XmlReaderSettings = New XmlReaderSettings()  
settings.Schemas.Add("http://www.contoso.com/books", "books.xsd")  
settings.ValidationType = ValidationType.Schema  
  
Dim reader As XmlReader = XmlReader.Create("books.xml", settings)  
  
Dim document As XmlDocument = New XmlDocument()  
document.Load(reader)  
Dim navigator As XPathNavigator = document.CreateNavigator()  
navigator.MoveToChild("books", "http://www.contoso.com/books")  
navigator.MoveToChild("book", "http://www.contoso.com/books")  
navigator.MoveToChild("published", "http://www.contoso.com/books")  
  
Console.WriteLine(navigator.SchemaInfo.SchemaType.Name)  
Console.WriteLine(navigator.SchemaInfo.Validity)  
Console.WriteLine(navigator.SchemaInfo.SchemaElement.MinOccurs)  
XmlReaderSettings settings = new XmlReaderSettings();  
settings.Schemas.Add("http://www.contoso.com/books", "books.xsd");  
settings.ValidationType = ValidationType.Schema;  
  
XmlReader reader = XmlReader.Create("books.xml", settings);  
  
XmlDocument document = new XmlDocument();  
document.Load(reader);  
XPathNavigator navigator = document.CreateNavigator();  
navigator.MoveToChild("books", "http://www.contoso.com/books");  
navigator.MoveToChild("book", "http://www.contoso.com/books");  
navigator.MoveToChild("published", "http://www.contoso.com/books");  
  
Console.WriteLine(navigator.SchemaInfo.SchemaType.Name);  
Console.WriteLine(navigator.SchemaInfo.Validity);  
Console.WriteLine(navigator.SchemaInfo.SchemaElement.MinOccurs);  

Exemplet tar books.xml filen som indata.

<books xmlns="http://www.contoso.com/books">  
    <book>  
        <title>Title</title>  
        <price>10.00</price>  
        <published>2003-12-31</published>  
    </book>  
</books>  

I exemplet används books.xsd även schemat som indata.

<xs:schema xmlns="http://www.contoso.com/books"
attributeFormDefault="unqualified" elementFormDefault="qualified"
targetNamespace="http://www.contoso.com/books"
xmlns:xs="http://www.w3.org/2001/XMLSchema">  
    <xs:simpleType name="publishedType">  
        <xs:restriction base="xs:date">  
            <xs:minInclusive value="2003-01-01" />  
            <xs:maxInclusive value="2003-12-31" />  
        </xs:restriction>  
    </xs:simpleType>  
    <xs:complexType name="bookType">  
        <xs:sequence>  
            <xs:element name="title" type="xs:string"/>  
            <xs:element name="price" type="xs:decimal"/>  
            <xs:element name="published" type="publishedType"/>  
        </xs:sequence>  
    </xs:complexType>  
    <xs:complexType name="booksType">  
        <xs:sequence>  
            <xs:element name="book" type="bookType" />  
        </xs:sequence>  
    </xs:complexType>  
    <xs:element name="books" type="booksType" />  
</xs:schema>  

Hämta inskrivna värden med valueAs-egenskaper

Det angivna värdet för en nod kan hämtas genom att TypedValue komma åt egenskapen för XPathNavigator. I vissa fall kanske du vill konvertera det angivna värdet för en nod till en annan typ. Ett vanligt exempel är att hämta ett numeriskt värde från en XML-nod. Tänk till exempel på följande icke-validerade och otypade XML-dokument.

<books>  
    <book>  
        <title>Title</title>  
        <price>10.00</price>  
        <published>2003-12-31</published>  
    </book>  
</books>  

XPathNavigator Om är placerad på elementet XmlTypeprice egenskapen skulle vara null, ValueType egenskapen skulle vara String, och TypedValue egenskapen skulle vara strängen 10.00.

Det går dock fortfarande att extrahera värdet som ett numeriskt värde med hjälp av ValueAsmetoden , ValueAsDouble, ValueAsInteller ValueAsLong och egenskaperna. I följande exempel visas hur du utför en sådan gjutning med hjälp av ValueAs metoden.

Dim document As New XmlDocument()  
document.Load("books.xml")  
Dim navigator As XPathNavigator = document.CreateNavigator()  
navigator.MoveToChild("books", "")  
navigator.MoveToChild("book", "")  
navigator.MoveToChild("price", "")  
  
Dim price = navigator.ValueAs(GetType(Decimal))  
Dim discount As Decimal = 0.2  
  
Console.WriteLine("The price of the book has been dropped 20% from {0:C} to {1:C}", navigator.Value, (price - price * discount))  
XmlDocument document = new XmlDocument();  
document.Load("books.xml");  
XPathNavigator navigator = document.CreateNavigator();  
navigator.MoveToChild("books", "");  
navigator.MoveToChild("book", "");  
navigator.MoveToChild("price", "");  
  
Decimal price = (decimal)navigator.ValueAs(typeof(decimal));  
  
Console.WriteLine("The price of the book has been dropped 20% from {0:C} to {1:C}", navigator.Value, (price - price * (decimal)0.20));  

Mer information om mappningen från inbyggda schematyper till CLR-typer finns i Typstöd i System.Xml-klasserna.

Se även