2009-03-21 12 views
7

È possibile verificare un'espressione XPath rispetto a un documento XML per verificarlo, ma esiste un modo semplice per verificare la stessa espressione XPath rispetto allo schema per tale documento?Posso convalidare un'espressione XPath su uno schema XML?

Dire che ho uno schema XSD come questo:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" ... etc> 
    <xsd:element name="RootData"> 
    <xsd:complexType> 
     <xsd:sequence minOccurs="0"> 
     <xsd:element name="FirstChild"> 
      <xsd:complexType> 
      <xsd:sequence minOccurs="0"> 
       <xsd:element name="FirstGrandChild"> 
... etc etc 

C'è un modo facile o built-in per verificare che il XPath:

/RootData/FirstChild/FirstGrandChild 

sarebbe valido contro tutti i documenti XML che può essere basato su quello schema? (Edit: Credo che voglio dire potenzialmente valida; il documento XML attuale potrebbe non contenere quegli elementi, ma che XPath potrebbe ancora essere considerata potenzialmente valida per lo schema considerando che, per esempio, /RootData/ClearlyInvalidChild/ThisElementDoesntExistEither è chiaramente valido..)

Ovviamente potrei aspettarmi che funzioni su espressioni XPath canoniche piuttosto che su una complessità arbitraria, ma va bene.

Sto pensando in particolare a .NET ma sono curioso di sapere se altre implementazioni lo rendono possibile. Non è così importante che voglio rotolare il mio, per esempio io non voglia di scrivere il mio codice per trasformare questa espressione XPath in un altro come:

/xsd:schema/xsd:element[@name='RootData']/xsd:complexType/xsd:sequence/xsd:element[@name='FirstChild']/...etc... 

... anche se so che potrei fallo se dovessi davvero.

Cheers!

+0

Tale XPath ad es. Non sarà valido contro * qualsiasi * documento basato su tale XSD - se FirstChild (o FirstGrandChild) si verificano 0 volte, quindi non sono sicuro di cosa si sta cercando. Forse vuoi dire che un XPath potrebbe essere valido contro * alcuni * documenti basati su quello schema. Si prega di precisare. – 13ren

+0

Ovviamente intendo "potenzialmente valido". Questo è un po 'quello che stavo ottenendo facendo riferimento a XPath canonico, ma ho modificato per chiarire che sto assumendo anche un possibile documento XML. – Gavin

+0

Non sono sicuro che le "espressioni XPath canoniche" abbiano una definizione tecnica precisa - la mia ipotesi era che intendevi nomi semplici senza vincoli. BTW: per i nomi semplici, quella trasformazione è semplice con le espressioni regolari (ma sfortunatamente non funzionerà per i tipi nominati, perché non sono nidificati) – 13ren

risposta

6

Abbiamo effettivamente realizzato un progetto di ricerca su questo e implementato un verificatore XPath, intorno al 2000. Questo era per XPath 1. Non sono a conoscenza di alcuna libreria attualmente disponibile che è possibile utilizzare per eseguire questa operazione.

Se si vuole andare e realizzare da soli, ecco alcuni suggerimenti:

  • non sarà in grado di trasformare un percorso su un documento di istanza in un percorso su uno schema come si fa sopra. Ad esempio, /a//b non si trasforma in /xsd:element[@name='a']//xsd:element[@name='b'] perché l'elemento b può essere definito al livello superiore dello schema, non al di sotto b.

  • Ricordare che mentre un documento XML è un albero, uno schema è un grafico.Se cerchi percorsi discendenti come // a, dovrai decidere quando terminare la ricerca o continuare per sempre (ad esempio, immagina in un elemento "a" che contiene "b", che contiene "a")

  • Alcuni percorsi saranno indecidibili o almeno molto difficili da decidere. Per esempio //*[starts-with(@name, 'foo')]

Se siete ancora in su per esso, io suggerisco di usare una libreria come eclisse del XSD o le classi dello schema di carico .NET caricare lo schema in memoria e fare il vostro controllo nel codice.

+0

Il tuo progetto di ricerca potrebbe essere un bel po 'di software. –

3

In fase di progettazione, è possibile utilizzare uno strumento per generare un documento XML di esempio ed eseguire XPath contro il campione. Altova XML Spy ha questa caratteristica, così come l'interfaccia utente SOAP.

SOAP UI è in realtà open source (Java), quindi forse si può dare un'occhiata e vedere come genera i campioni. In una situazione di runtime (ad esempio se lo schema e XPath sono entrambi input per un programma in esecuzione), è necessario assicurarsi che siano stati generati abbastanza componenti opzionali e dati di esempio per evitare falsi negativi e potrebbe essere necessario generare più file di esempio.

Non vorrei provare a valutare l'XPath direttamente sullo schema poiché i vari assi renderebbero la soluzione completa molto complicata. Sono abbastanza sicuro che potrebbe essere fatto, ma mi sembra una matematica fondamentale. Propongo la generazione di campioni come scorciatoia.

Problemi correlati