使用 node.js xpath xmldom 读取 XML 文件
Read an XML file using node.js xpath xmldom
我正在尝试使用节点包 XPATH 和 XMLDOM select XML 文档的某些部分,但我对元素值一无所知。猜测这可能是我的 XPATH 定义,但老实说我不知道。
我的 XML 的顶部如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="define2-0-0.xsl"?>
<ODM
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.cdisc.org/ns/odm/v1.3"
xmlns:def="http://www.cdisc.org/ns/def/v2.0"
ODMVersion="1.3.2"
FileType="Snapshot"
FileOID="StudyNum.ADaM-IG.1.0"
CreationDateTime="2018-02-08T09:40:51">
<Study OID="StudyNum.ADaM-IG.1.0">
<GlobalVariables>
<StudyName>StudyNum</StudyName>
<StudyDescription>Study Description</StudyDescription>
<ProtocolName>StudyName_PRCL_StudyNum</ProtocolName>
</GlobalVariables>
<MetaDataVersion OID="MDV.StudyNum.ADaM-IG.1.0" Name="Study StudyNum Data Definitions"
Description="Awful Syndrome"
def:DefineVersion="2.0.0"
到目前为止我的代码如下所示:
var xpath = require('xpath'),
dom = require('xmldom').DOMParser,
fs = require('fs');
var xml = fs.readFileSync('./Define/define.xml', 'utf8').toString();
var select = xpath.useNamespaces({"xlink":"http://www.w3.org/1999/xlink", "ODM":"http://www.cdisc.org/ns/odm/v1.3", "def":"http://www.cdisc.org/ns/def/v2.0"});
var doc = new dom().parseFromString(xml)
console.log("test 1 : " + select('//ODM:Study/@OID', doc)[0].nodeValue);
console.log("test 2 : " + select('//ODM:Study/GlobalVariables/StudyName/', doc)[0].nodeValue);
第一个测试产生了预期的结果,但我只是得到了 'test 2' 的错误。我错过了显而易见的东西吗?
谢谢。
您只是忘记了在元素上使用 xmlns="..."
定义的名称空间会继承到子节点。
因此,XML 中的 xmlns="http://www.cdisc.org/ns/odm/v1.3"
行使所有子项都具有此(ODM
)命名空间。
//ODM:Study/ODM:GlobalVariables/ODM:StudyName
把它放在整个表达式中是
console.log("test 2 : " + select('//ODM:Study/ODM:GlobalVariables/ODM:StudyName', doc)[0].nodeValue);
我正在尝试使用节点包 XPATH 和 XMLDOM select XML 文档的某些部分,但我对元素值一无所知。猜测这可能是我的 XPATH 定义,但老实说我不知道。
我的 XML 的顶部如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="define2-0-0.xsl"?>
<ODM
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.cdisc.org/ns/odm/v1.3"
xmlns:def="http://www.cdisc.org/ns/def/v2.0"
ODMVersion="1.3.2"
FileType="Snapshot"
FileOID="StudyNum.ADaM-IG.1.0"
CreationDateTime="2018-02-08T09:40:51">
<Study OID="StudyNum.ADaM-IG.1.0">
<GlobalVariables>
<StudyName>StudyNum</StudyName>
<StudyDescription>Study Description</StudyDescription>
<ProtocolName>StudyName_PRCL_StudyNum</ProtocolName>
</GlobalVariables>
<MetaDataVersion OID="MDV.StudyNum.ADaM-IG.1.0" Name="Study StudyNum Data Definitions"
Description="Awful Syndrome"
def:DefineVersion="2.0.0"
到目前为止我的代码如下所示:
var xpath = require('xpath'),
dom = require('xmldom').DOMParser,
fs = require('fs');
var xml = fs.readFileSync('./Define/define.xml', 'utf8').toString();
var select = xpath.useNamespaces({"xlink":"http://www.w3.org/1999/xlink", "ODM":"http://www.cdisc.org/ns/odm/v1.3", "def":"http://www.cdisc.org/ns/def/v2.0"});
var doc = new dom().parseFromString(xml)
console.log("test 1 : " + select('//ODM:Study/@OID', doc)[0].nodeValue);
console.log("test 2 : " + select('//ODM:Study/GlobalVariables/StudyName/', doc)[0].nodeValue);
第一个测试产生了预期的结果,但我只是得到了 'test 2' 的错误。我错过了显而易见的东西吗?
谢谢。
您只是忘记了在元素上使用 xmlns="..."
定义的名称空间会继承到子节点。
因此,XML 中的 xmlns="http://www.cdisc.org/ns/odm/v1.3"
行使所有子项都具有此(ODM
)命名空间。
//ODM:Study/ODM:GlobalVariables/ODM:StudyName
把它放在整个表达式中是
console.log("test 2 : " + select('//ODM:Study/ODM:GlobalVariables/ODM:StudyName', doc)[0].nodeValue);