Javascript 根据条件选择和显示值
我有下面的XML,在这里我删除了很多属性和数据以使它更简单Javascript 根据条件选择和显示值,javascript,node.js,xml,xpath,Javascript,Node.js,Xml,Xpath,我有下面的XML,在这里我删除了很多属性和数据以使它更简单 <isoColumns TYPE="string" SID="175" NORDERBY="6" NULLABLE="N" MAXLENGTH="65" ISKEY="N" COLNAME="IN_RELATION_ACTIVITY" LABEL="Where" INFOR
<isoColumns TYPE="string" SID="175" NORDERBY="6" NULLABLE="N" MAXLENGTH="65" ISKEY="N" COLNAME="IN_RELATION_ACTIVITY" LABEL="Where" INFORM="Y" INQUERY="N" CATEGORY="1" ISOCID="251319" LINEFEED="X" />
<isoColumns TYPE="date" SID="175" NORDERBY="7" NULLABLE="N" MAXLENGTH="10" ISKEY="N" COLNAME="DATE_" LABEL="Date" INFORM="Y" INQUERY="N" CATEGORY="1" ISOCID="251325" LINEFEED="X" GROUPID="251315" TXTHEAD="Baseline data"/>
<isoColumns TYPE="date" SID="175" NORDERBY="9" NULLABLE="Y" MAXLENGTH="10" ISKEY="N" COLNAME="DATE_OF_LASTCHANGE" LABEL="last change" INFORM="N" INQUERY="N" CATEGORY="2" ISOCID="606525" />
<isoColumns TYPE="date" SID="175" NORDERBY="10" NULLABLE="N" MAXLENGTH="10" ISKEY="N" COLNAME="DATE_OF_REPORT" LABEL="report" INFORM="Y" INQUERY="N" CATEGORY="2" ISOCID="251331" LINEFEED="X" "/>
<isoColumns TYPE="time" SID="175" NORDERBY="11" NULLABLE="Y" MAXLENGTH="15" ISKEY="N" COLNAME="DATE_OF_REPORT" LABEL="Time" INFORM="Y" INQUERY="N" CATEGORY="0" ISOCID="251179" LINEFEED="X"/>
<isoColumns TYPE="string" SID="175" NORDERBY="12" NULLABLE="Y" MAXLENGTH="20" ISKEY="N" COLNAME="USER_" LABEL="last change" INFORM="Y" INQUERY="N" CATEGORY="2" ISOCID="251315" />
<isoColumns TYPE="string" SID="175" NORDERBY="13" NULLABLE="Y" MAXLENGTH="35" ISKEY="N" COLNAME="PLACE_FOR_SAR" LABEL="Country" INFORM="Y" INQUERY="N" CATEGORY="1" ISOCID="251332" LINEFEED="X" GROUPID="251243" TXTHEAD="Place for SAE/SAR"/>
<isoColumns TYPE="string" SID="175" NORDERBY="14" NULLABLE="Y" MAXLENGTH="35" ISKEY="N" COLNAME="CENTER_FOR_SAR" LABEL="Center" INFORM="Y" INQUERY="N" CATEGORY="1" ISOCID="251333" />
我想做几件事
isoColumns
有一个名为TXTHEAD
的属性,我想打印它的值。如上所述,一个isoColumn
具有TXTHEAD=“基线数据”
。我想打印基线数据
这是我用以下代码尝试的内容:
obj.forEach(function (n) {
if(xpath.select("../../*[@TXTHEAD]",n)) { <--- Trying to check if attribute "TXTHEAD" exists
var test = ""+xpath.select("../../@TXTHEAD",n);
console.log(test.value);
}
说清楚。。。当我编写一个等列时,我的意思是这样的(这是我们在XML中看到的许多内容):
我不完全确定第2部分的内容,但以下内容至少可以让您接近我认为您需要的内容:
let DOMParser = require('xmldom').DOMParser
, xpath = require('xpath')
, XMLSerializer = require('xmldom').XMLSerializer;
# for part 1
let th = xpath.select("//isoColumns[@TXTHEAD]/@TXTHEAD", root);
for (let t of th) {
target = xpath.select('.//*/@*',t)
console.log(t.nodeValue);
};
# for part 2
let gi = xpath.select("//isoColumns[@GROUPID]", root);
myArray =[];
for (let g of gi){
gid = xpath.select("./@GROUPID",g)[0].nodeValue;
targets = xpath.select(".//following-sibling::*",g);
for (let target of targets) {
let serializedXML = new XMLSerializer().serializeToString(target);
myArray.push(serializedXML);
iid = xpath.select("./@ISOCID",target)[0].nodeValue
if(iid === gid) {
for (let r of myArray){
console.log(r)};
return;
}
};
};
输出:
Baseline data
Place for SAE/SAR
<isoColumns TYPE="date" SID="175" NORDERBY="9" NULLABLE="Y" MAXLENGTH="10" ISKEY="N" COLNAME="DATE_OF_LASTCHANGE" LABEL="last change" INFORM="N" INQUERY="N" CATEGORY="2" ISOCID="606525"/>
<isoColumns TYPE="date" SID="175" NORDERBY="10" NULLABLE="N" MAXLENGTH="10" ISKEY="N" COLNAME="DATE_OF_REPORT" LABEL="report" INFORM="Y" INQUERY="N" CATEGORY="2" ISOCID="251331" LINEFEED="X"/>
<isoColumns TYPE="time" SID="175" NORDERBY="11" NULLABLE="Y" MAXLENGTH="15" ISKEY="N" COLNAME="DATE_OF_REPORT" LABEL="Time" INFORM="Y" INQUERY="N" CATEGORY="0" ISOCID="251179" LINEFEED="X"/>
<isoColumns TYPE="string" SID="175" NORDERBY="12" NULLABLE="Y" MAXLENGTH="20" ISKEY="N" COLNAME="USER_" LABEL="last change" INFORM="Y" INQUERY="N" CATEGORY="2" ISOCID="251315"/>
基线数据
SAE/SAR的地点
问题的第2部分不清楚:鉴于问题中的xml,您能否编辑您的问题并添加预期的输出?非常感谢,这正是我所需要的。我注意到您使用let而不是var。这只是个人偏好吗?@user1960836很高兴它起作用了!使用let主要是个人偏好,尽管两者之间存在差异。。
<isoColumns TYPE="date" SID="175" NORDERBY="7" NULLABLE="N" MAXLENGTH="10" ISKEY="N" COLNAME="DATE_" LABEL="Date" INFORM="Y" INQUERY="N" CATEGORY="1" ISOCID="251325" LINEFEED="X" GROUPID="251315" TXTHEAD="Baseline data"/>
let DOMParser = require('xmldom').DOMParser
, xpath = require('xpath')
, XMLSerializer = require('xmldom').XMLSerializer;
# for part 1
let th = xpath.select("//isoColumns[@TXTHEAD]/@TXTHEAD", root);
for (let t of th) {
target = xpath.select('.//*/@*',t)
console.log(t.nodeValue);
};
# for part 2
let gi = xpath.select("//isoColumns[@GROUPID]", root);
myArray =[];
for (let g of gi){
gid = xpath.select("./@GROUPID",g)[0].nodeValue;
targets = xpath.select(".//following-sibling::*",g);
for (let target of targets) {
let serializedXML = new XMLSerializer().serializeToString(target);
myArray.push(serializedXML);
iid = xpath.select("./@ISOCID",target)[0].nodeValue
if(iid === gid) {
for (let r of myArray){
console.log(r)};
return;
}
};
};
Baseline data
Place for SAE/SAR
<isoColumns TYPE="date" SID="175" NORDERBY="9" NULLABLE="Y" MAXLENGTH="10" ISKEY="N" COLNAME="DATE_OF_LASTCHANGE" LABEL="last change" INFORM="N" INQUERY="N" CATEGORY="2" ISOCID="606525"/>
<isoColumns TYPE="date" SID="175" NORDERBY="10" NULLABLE="N" MAXLENGTH="10" ISKEY="N" COLNAME="DATE_OF_REPORT" LABEL="report" INFORM="Y" INQUERY="N" CATEGORY="2" ISOCID="251331" LINEFEED="X"/>
<isoColumns TYPE="time" SID="175" NORDERBY="11" NULLABLE="Y" MAXLENGTH="15" ISKEY="N" COLNAME="DATE_OF_REPORT" LABEL="Time" INFORM="Y" INQUERY="N" CATEGORY="0" ISOCID="251179" LINEFEED="X"/>
<isoColumns TYPE="string" SID="175" NORDERBY="12" NULLABLE="Y" MAXLENGTH="20" ISKEY="N" COLNAME="USER_" LABEL="last change" INFORM="Y" INQUERY="N" CATEGORY="2" ISOCID="251315"/>