2009-03-21 14 views
7

Puede verificar una expresión XPath contra un documento XML para verificarlo, pero ¿hay alguna manera fácil de verificar la misma expresión XPath en el esquema para ese documento?¿Puedo validar una expresión XPath contra un esquema XML?

Decir que tengo un esquema XSD de esta manera:

<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 

¿Hay una manera fácil o incorporada para verificar que el XPath:

/RootData/FirstChild/FirstGrandChild 

sería válida en contra de cualquier documento XML que puede estar basado en ese esquema? (Editar: supongo que quiero decir potencialmente válidas; el documento XML real no contenga esos elementos, sino que XPath aún podría ser considerado potencialmente válidas para el esquema Considerando que, por ejemplo, /RootData/ClearlyInvalidChild/ThisElementDoesntExistEither es claramente válido..)

Por supuesto, solo podría esperar que esto funcione contra las expresiones XPath canónicas en lugar de las de complejidad arbitraria, pero está bien.

Estoy pensando específicamente en .NET pero tengo curiosidad si otras implementaciones lo hacen posible. No es tan importante que quiero rodar mi cuenta, por ejemplo, yo realmente no quiero escribir mi propio código para transformar esa expresión XPath en otro como:

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

... aunque sé que podría hazlo si realmente tuviera que hacerlo.

¡Salud!

+0

Ese XPath, por ejemplo, no será válido contra * cualquier * documento basado en ese XSD - si FirstChild (o FirstGrandChild) ocurre 0 veces, entonces no estoy seguro exactamente de lo que está buscando. Quizás quiera decir que un XPath podría ser válido contra * algún * documento basado en ese esquema. Por favor aclara – 13ren

+0

Por supuesto que quiero decir "potencialmente válido". Eso es un poco a lo que me refería al referirme a XPath canónico, pero he editado para aclarar que también estoy asumiendo un posible documento XML. – Gavin

+0

No estoy seguro de que las "expresiones de XPath canónicas" tengan una definición técnica precisa; supongo que se refería a nombres simples sin restricciones. Por cierto: para nombres simples, esa transformación es sencilla con expresiones regulares (pero desafortunadamente no funcionará para tipos con nombre, porque no están anidados) – 13ren

Respuesta

6

De hecho, hicimos un proyecto de investigación sobre esto, e implementamos un verificador XPath, en algún momento alrededor de 2000. Esto fue para XPath 1. No conozco ninguna biblioteca disponible actualmente que pueda usar para hacer esto.

Si quieres ir y poner en práctica esto por sí mismo, he aquí algunos consejos:

  • usted no será capaz de transformar un camino sobre un documento de instancia en un camino sobre un esquema como lo hace arriba. Por ejemplo, /a//b no se transforma en /xsd:element[@name='a']//xsd:element[@name='b'] porque el elemento b se puede definir en el nivel superior del esquema, no debajo de b.

  • Recuerde que si bien un documento XML es un árbol, un esquema es un gráfico.Si busca rutas descendientes como // a, tendrá que decidir cuándo finalizar la búsqueda o puede continuar para siempre (por ejemplo, imagine en un elemento "a" que contenga "b", que contiene "a")

  • Algunos caminos serán indecidibles o al menos muy difíciles de decidir. Por ejemplo //*[starts-with(@name, 'foo')]

Si todavía para ella, se sugiere emplear una biblioteca como el eclipse de XSD o las clases de esquema de carga NET para cargar el esquema en la memoria y hacer su cuenta de cheques en el código.

+0

Su proyecto de investigación puede ser un software bastante valioso. –

3

En el momento del diseño, puede usar una herramienta para generar un documento XML de muestra y ejecutar su XPath contra la muestra. Altova XML Spy tiene esta característica, al igual que la interfaz de usuario SOAP.

SOAP UI es en realidad de código abierto (Java), así que tal vez pueda echar un vistazo y ver cómo genera las muestras. En una situación de tiempo de ejecución (es decir, si el esquema y XPath son ambas entradas para un programa en ejecución), debe asegurarse de que se generaron suficientes componentes opcionales y datos de muestra para evitar falsos negativos y es posible que deba generar varios archivos de ejemplo.

No trataría de evaluar el XPath directamente contra el esquema ya que los diversos ejes harían una solución completa muy complicada. Estoy bastante seguro de que podría hacerse, pero me parece una matemática dura. Propongo generar muestras como un atajo.

Cuestiones relacionadas