Я написал парсер C++ XPath с библиотекой libxml++, которая была построена на библиотеке C libxml2. Он отлично работает, когда xmlns
отсутствует в xml, но он ломается, когда это пространство имен добавлено.Зарегистрировать пространство имен с помощью libxml ++ для XPath
Пример XML:
<A xmlns="http://some.url/something">
<B>
<C>hello world</C>
<B>
</a>
Пример XPath:
string xpath = "/A/B/C" // returns nothing when xmlns is present in the XML
Я нашел this answer и пытался регулировать мой XPath к следующему, который делает работу, но это делает XPath вид неприятны для чтения и написать.
string xpath = "/*[name()='A']/*[name()='B']/*[name()='C']"
В идеале я хочу зарегистрировать пространство имен, чтобы использовать обычные XPaths. Я также просмотрел документацию по libxml ++ и нашел Node.set_namespace
, но он просто вызывает исключение, когда я пытаюсь его использовать.
root_node->set_namespace("http://some.url/something");
// exception: The namespace (http://some.url/something) has not been declared.
Однако root_node
определенно известно о пространстве имен, когда он анализирует документ XML:
cout << "namespace uri: " << root_node->get_namespace_uri();
// namespace uri: http://some.url/something
На данный момент я из идей, поэтому помощь очень ценится.
EDIT Также пробовал:
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:
не жалуется, но не появляется для регистрации имен.
Я думаю, вам нужно использовать: недействительным xmlpp :: Element :: set_namespace_declaration \t (\t const std :: string & \t ns_uri, const std :: string & \t ns_prefix = std :: string() ) определяется [здесь] (http://libxmlplusplus.sourceforge.net/docs/reference/1.0/html/classxmlpp_1_1Element.html#a2) – SomeDude
Ну, моя переменная - это «Узел», но «Элемент» является дочерним элементом ' Узел, поэтому я мог бы заставить его работать. Я попробую. –
Тип узла может быть типом элемента Element и infact здесь «A» - это элемент, который я предполагаю. – SomeDude