Ich schrieb einen C++ - XPath-Parser mit der libxml++-Bibliothek, die auf der C libxml2-Bibliothek erstellt wurde. Es funktioniert gut, wenn die xmlns
nicht in Xml vorhanden ist, aber es bricht, wenn dieser Namespace hinzugefügt wird.Namespace registrieren mit libxml ++ für XPath
Probe xml:
<A xmlns="http://some.url/something">
<B>
<C>hello world</C>
<B>
</a>
Probe XPath:
string xpath = "/A/B/C" // returns nothing when xmlns is present in the XML
ich this answer gefunden und versucht, meine XPath auf die folgende Einstellung, die Arbeit tut, aber es macht die XPath Art unausstehlich zu lesen und schreiben.
string xpath = "/*[name()='A']/*[name()='B']/*[name()='C']"
Idealerweise möchte ich den Namespace registrieren, damit ich normale XPaths verwenden kann. Ich habe auch die libxml ++ Dokumentation durchsucht und eine Node.set_namespace
gefunden, aber es verursacht nur eine Ausnahme, wenn ich versuche, es zu verwenden.
root_node->set_namespace("http://some.url/something");
// exception: The namespace (http://some.url/something) has not been declared.
jedoch die root_node
ist auf jeden Fall bewusst, den Namespace, wenn es das Dokument XML analysiert:
cout << "namespace uri: " << root_node->get_namespace_uri();
// namespace uri: http://some.url/something
An dieser Stelle ich aus Ideen bin so ist Hilfe sehr geschätzt.
EDIT auch versucht:
Element *root_node = parser->get_document()->get_root_node();
root_node->set_namespace_declaration("http://some.url/something","x");
cout << "namespace uri: " << root_node->get_namespace_uri() << endl;
cout << "namespace prefix: " << root_node->get_namespace_prefix() << endl;
// namespace uri: http://some.url/something
// namespace prefix:
beschwert sich nicht, aber scheint nicht den Namespace zu registrieren.
Ich glaube, Sie verwenden müssen: Leere xmlpp :: Element :: set_namespace_declaration \t (\t) const std :: string & \t ns_uri, const std :: zeichenfolge & \t ns_prefix = std :: string() ) definiert [hier] (http://libxmlplusplus.sourceforge.net/docs/reference/1.0/html/classxmlpp_1_1Element.html#a2) – SomeDude
Nun, meine Variable ist ein 'Node', aber' Element' ist ein Kind von ' Node', damit ich es schaffen kann. Ich werde es versuchen. –
Knotentyp kann Element Knotentyp sein und infact hier 'A' ist ein Element Knoten ich vermute. – SomeDude