У меня есть XML-документ, подобный следующему.
<library>
<artist name="a">
<album name="1"></album>
<album name="2"></album>
</artist>
<artist name="b">
<album name="8"></album>
<album name="9"></album>
</artist>
</library>`
Я пишу приложение на Vala в Ubuntu и использую библиотеку libxml2 для управления XML-документом. Я хотел получить все узлы album
независимо от их положения в документе. Я написал следующий фрагмент кода для выполнения вышеупомянутой работы.
document = Xml.Parser.parse_file (PATH_TO_DB);
...
Xml.XPath.Context context;
unowned Xml.XPath.Object *object;
context = new Xml.XPath.Context(document);
object = context.eval("//album");
if(object->nodesetval->is_empty())
return null;
return object->nodesetval->item(0);
...
Этот запрос XPath возвращает только альбомы под номером artist a
, т. е. альбомы 1 и 2. Однако context.eval("/library/artist[@name="b"]/album");
возвращает все альбомы под номером artist b
.
Эквивалент показанного выше кода на Python дает желаемый результат.
doc = libxml2.parseFile("data.xml")
ctxt = doc.xpathNewContext()
res = ctxt.xpathEval("//album")
Что не так с кодом Валы?