Могу ли я использовать относительные выражения XPath в libxml2? - PullRequest
4 голосов
/ 13 мая 2010

Мне интересно, возможно ли использовать относительные выражения XPath в libxml2.

Это из API javax.xml.xpath, и я хотел бы сделать то же самое, используя libxml2:

Node widgetNode = (Node) xpath.evaluate(expression, document, XPathConstants.NODE);

со ссылкой на элемент, относительное выражение XPath Теперь можно написать, чтобы выбрать дочерний элемент:

XPath xpath = XPathFactory.newInstance().newXPath();
String expression = "manufacturer";
Node manufacturerNode = (Node) xpath.evaluate(expression, **widgetNode**, XPathConstants.NODE);

Ответы [ 2 ]

6 голосов
/ 15 июня 2011

Вот пример кода:

xmlXPathContextPtr xpathCtx = xmlXPathNewContext(doc);

const xmlChar* xpathExpr = BAD_CAST "//column";
xmlXPathObjectPtr columnXPathObj = xmlXPathEvalExpression(xpathExpr, xpathCtx);


// Do whatever you want with your query here. Usually iterate over the result.
// Inside this iteration I do:

cur = columnNodes->nodeTab[i];

// Important part
xpathCtx->node = cur;

// After which you can do something like:
xmlXPathObjectPtr screenXPathObj = xmlXPathEvalExpression(BAD_CAST "screen", xpathCtx); 
xmlNodeSetPtr screenNodes = screenXPathObj->nodesetval;
for (int j = 0; j < screenNodes->nodeNr; j++) {
// You're now iterating over the <screen>s inside the curent <column>
}

Надеюсь, это кому-нибудь поможет.

5 голосов
/ 16 мая 2010

Установите член узла вашего объекта xmlXPathContext.

...