2016-06-22 12 views
2

die XML Gegeben:Wie zwischen Attribute und Elementknoten unterscheiden zurück von einer sächsischen XPathSelector

<root name="value"> 
    <level1> 
    <level2>Text</level2> 
    </level1> 
</root> 

ich die XPath will /root/@name zurückzukehren value und den XPath /root/level1 die XML-Serialisierung des <level1> Knoten zurückzukehren:

<level1> 
    <level2>Text</level2> 
    </level1> 

Ich benutze die a9api-Schnittstelle von Saxon 9.6 in Java.

Ich habe festgestellt, dass ich XdmValue.toString() nennen kann die XML-Serialisierung des Ergebnisses der Auswertung des XPath zu erhalten, die für die Auswahl eines Elements mir das gewünschte Ergebnis erhält, liefert aber name="value" wenn ein Attribut auswählen. Und ich kann XdmItem.getStringValue() anrufen, um die string value zu erhalten, die mir den richtigen Wert für das Attribut erhält, aber den textuellen Inhalt des Elements zurückgibt.

Michael Kay hat zuvor said "Saxon's s9api interface ... returns XdmValue objects whose type you can interrogate". Ich kann sehen, dass ich eine instanceof Prüfung durchführen könnte, um festzustellen, ob es ein XdmAtomicValue, XdmExternalObject, XdmFunctionItem oder XdmNode ist, aber Elemente und Attribute sind beide Instanzen von XdmNode. Wie unterscheide ich zwischen den beiden?

(ich die XPaths nicht ändern kann, wie sie durch den Benutzer zur Verfügung gestellt sind.)

Antwort

3

ich die Antwort gefunden, wie ich die Frage schriftlich abgeschlossen, so dass ich es für andere teilen.

die XdmItem zu einem XdmNode Nach dem Gießen Sie XdmNode.getNodeKind() aufrufen kann, die einen Wert aus der Aufzählung XdmNodeKind Spezifizierungs kehrt die Knotentyp ist:

 XdmValue matchList = xPathSelector.evaluate(); 
     XdmItem firstItem = matchList.itemAt(0); 
     if (firstItem instanceof XdmNode) { 
      XdmNode xdmNode = (XdmNode) firstItem; 
      XdmNodeKind nodeKind = xdmNode.getNodeKind(); 
      if (nodeKind == XdmNodeKind.ELEMENT) { 
       return xdmNode.toString(); 
      } 
     } 
     return firstItem.getStringValue();