2016-05-02 13 views
2
<?xml version="1.0"?> 
<catalog> 
    <book id="bk101"> 
     <author>Gambardella, Matthew</author> 
     <title>XML Developer's Guide</title> 
     <genre>Computer</genre> 
     <price>44.95</price> 
     <publish_date>2000-10-01</publish_date> 
     <description>An in-depth look at creating applications 
     with XML.</description> 
    </book> 
    <book id="bk102"> 
     <author>Ralls, Kim</author> 
     <title>Midnight Rain</title> 
     <genre>Fantasy</genre> 
     <price>5.95</price> 
     <publish_date>2000-12-16</publish_date> 
     <description>A former architect battles corporate zombies, 
     an evil sorceress, and her own childhood to become queen 
     of the world.</description> 
    </book> 
<catalog> 

IXMLDOMNode* pnode; 
IXMLDOMNode* pNodeAuthor = NULL; 
pnode->selectSingleNode (CComBSTR(L"author"), & pNodeAuthor); 

ODERÄhnliche Funktion zu selectSingleNode in Libxml2?

getElementsByTagName("book[@id='bk101']") 

ODER

selectNodes("//book[@id='bk101']") 

Q: In der obigen XML-Datei mit Microsofts XML DOM Ich bin der Lage, jeden spezifischen Knoten zu erhalten, indem selectSingleNode() oder getElementbyTagName() oder Select() -Funktion, nur durch die Übergabe des Knotennamens.

Ich möchte das gleiche mit Libxml2 tun, ich habe alle Standardfunktionen gelesen, aber keine Funktion wie das bekommen, wenn Sie irgendeine Funktion ähnlich oder die andere Möglichkeit, das dann wissen, bitte helfen!

Antwort

2

Es ist viel Zeit, die ich libxml2 nicht verwenden, aber ...

Es gibt mehr Möglichkeiten, es zu tun sind. Eine Möglichkeit ist mit XPath

Here es ist ein Beispiel

Kurz gesagt, zunächst einmal sollten Sie die XML-Datei öffnen und analysieren, zu erhalten ein xmlDocPtr mit xmlParseFile()

xmlDocPtr xmlDoc = xmlParseFile(fileName); 

Als nächstes sollten Sie eine XML erstellen -path Zusammenhang mit xmlXPathNewContext()

xmlXPathContextPtr xPathCnt = xmlXPathNewContext(xmlDoc); 

Jetzt können Sie Knoten mit XPath rul finden es; in Ihrem Fall

xmlXPathObjectPtr result = xmlXPathEvalExpression((xmlChar*)"//book[@id=\'bk101\']", xPathCnt); 

Wenn das Ergebnis nicht empy ist, und Sie können dies mit

xmlXPathNodeSetIsEmpty(result->nodesetval) 

sollten Sie Ihre Elemente in result->nodessetval sein und sie Nummer sollte result->nodessetval->nodeNr

Weitere Details werden in das verknüpfte Beispiel sorry für mein schlechtes Englisch

+0

Danke:

P. S .: Vorsicht, Code nicht

p.s.2 getestet. Ich habe eine rekursive Funktion erstellt, die den Knoten durchquert. – Kru