Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 根据条件选择和显示值_Javascript_Node.js_Xml_Xpath - Fatal编程技术网

Javascript 根据条件选择和显示值

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

我有下面的XML,在这里我删除了很多属性和数据以使它更简单

<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"/>