Domanda

Ho un xml:

<Customer id="">
 <Name />
 <Address />
</Customer>

Vorrei selezionare solo un nodo principale con i suoi attributi senza i suoi nodi secondari:

<Customer id=""/ >

E 'una cosa possibile con XPath?

È stato utile?

Soluzione

No, questo non è possibile in XPath.

Non è possibile selezionare il nodo senza i suoi figli, perché senza i suoi figli sarebbe un altro nodo, quindi non sarebbe seleziona un nodo dal documento originale.

Per creare l'output che si desidera è necessario utilizzare un linguaggio che permette di creare nuovi nodi, quindi non è possibile farlo in XPath. È possibile utilizzare XQuery per creare nuovi nodi, questo dovrebbe funzionare:

element {fn:node-name(/*)} {/*/@*}

Altri suggerimenti

XPath non altera alcun documento XML di origine e questo è di progettazione .

Per produrre un nuovo documento XML da uno esistente, trasformazione è necessario.

XSLT è stato progettato appositamente per trasformare una serie di alberi (inclusi i documenti XML) in alberi di risultato.

Questa trasformazione :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>

    <xsl:template match="/*">
      <xsl:copy>
       <xsl:copy-of select="@*"/>
      </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

quando applicato sul documento XML fornito :

<Customer id="">
    <Name />
    <Address />
</Customer>

produce il desiderato, risultato corretto :

<Customer id=""/>
$doc = new DOMDocument();
$doc->loadHTML($str);

$xPath = new DOMXpath($doc);
$xPathQuery = "//text()[contains(translate(.,'abcdefghijklmnopqrstuvwxyz',  'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), '<Customer id=\"\">')]";
$elements = $xPath->query($xPathQuery);

if($elements->length > 0){

foreach($elements as $element){
    print "Found: " .$element->nodeValue."<br />";
}

Questa espressione XQuery:

element {name(/*)} {/*/@*}

Output:

<?xml version="1.0" encoding="UTF-8"?><Customer id=""/>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top