Не удается получить элементы с помощью xpath из узла OpcUa - PullRequest
1 голос
/ 30 апреля 2020

Я пытаюсь запросить с помощью xpath этот XML файл (https://github.com/OPCFoundation/UA-Nodeset/blob/master/Robotics/Opc.Ua.Robotics.NodeSet2.xml). Я пытаюсь получить все элементы внутри тега "UANodeSet", но я всегда получаю пустой возврат. Я работаю с node js Вот мой код:

nodes = fs.readFileSync(Nodeset+".xml", "utf-8");
var data = xpath.select("//UANodeSet", nodes)
fs.writeFileSync("./data.xml" , data);

Используемая мной библиотека взята из npm и называется xpath.

Ожидается, что все дочерние элементы внутри UANodeSet, реальность такова, что у меня пустой возврат. Вы знаете, как ее решить?

Извините, впервые работаю с xpath.

Хорошо, первая проблема решена. Сейчас я пытаюсь получить все UAObjectType, но кажется, что вывод xml действительно неправильно отформатирован, и я не знаю, почему. Вот это код:

var select = xpath.useNamespaces({"ns" : "http://www.w3.org/2001/XMLSchema-instance" , "ns1" : "http://opcfoundation.org/UA/2011/03/UANodeSet.xsd" , "ns2" : "http://opcfoundation.org/UA/2008/02/Types.xsd", "ns3" : "http://www.siemens.com/OPCUA/2017/SimaticNodeSetExtensions" ,"ns4" : "http://www.w3.org/2001/XMLSchema" });
var data = select('//ns1:UAObjectType' , ns)
fs.writeFileSync("./data.xml" , data);

Кто-нибудь знает, как это решить?

1 Ответ

1 голос
/ 30 апреля 2020

Файл xml использует пространства имен, и это, кажется, запутывает выражение xpath. Попробуйте что-то вроде этого и посмотрите, работает ли оно:

dom = require('xmldom').DOMParser
var doc = new dom().parseFromString(nodes)
var targets = xpath.select("//*[local-name()='UAObject']", doc)

Другое решение:

var select = xpath.useNamespaces({"ns1" : "http://opcfoundation.org/UA/2011/03/UANodeSet.xsd" });
var data = select('//ns1:UAObjectType' , ns)
...