【问题标题】:Nested xml - retrieve all itemNos that satisfies condition嵌套 xml - 检索满足条件的所有 itemNos
【发布时间】:2022-11-29 20:17:22
【问题描述】:

我要返回所有满足条件的itemNos No。但是我的代码只返回第一个 itemNo(其 Detail Id="3")而不返回其余的。

下面仅返回“0001”。我如何让它同时返回“0001”和“0002”,因为两者的 ID = 3。

XML 结构:

<!-- language: lang-xml -->

<xml>
  <Items>

    <Item No="0001">
      <Details>
        <Detail Id="3">
          <Colors>
            <Color colorName="green" />
            <Color colorName="yellow" />
          </Colors>
        </Detail>
      </Details>
    </Item>

    <Item No="0002">
      <Details>
        <Detail Id="3">
          <Colors>
            <Color colorName="purple" />
            <Color colorName="pink" />
          </Colors>
        </Detail>
        <Detail Id="6">
          <Colors>
            <Color colorName="grey" />
            <Color colorName="orange" />
          </Colors>
        </Detail>
      </Details>
    </Item>

    <Item No="0003">
      <Details>
        <Detail Id="8">
          <Colors>
            <Color colorName="red" />
          </Colors>
        </Detail>
      </Details>
    </Item>

  </Items>
</xml>     

const search_id = "3"

const foundNo = []

let ans= xmlDoc.evaluate(`//Item[Details/Detail/@Id="${search_id}"]/@No`, xmlDoc.documentElement);
        const foundNode = ans.iterateNext();
        foundNo = foundNode.textContent // this returns Item No "0001"

我如何让它同时返回“0001”和“0002”。当前仅返回“0001”。谢谢你。

【问题讨论】:

    标签: javascript xml xpath


    【解决方案1】:

    使用基于浏览器的 XPath API,您需要迭代并收集结果:

    const xml = `<xml>
      <Items>
    
        <Item No="0001">
          <Details>
            <Detail Id="3">
              <Colors>
                <Color colorName="green" />
                <Color colorName="yellow" />
              </Colors>
            </Detail>
          </Details>
        </Item>
    
        <Item No="0002">
          <Details>
            <Detail Id="3">
              <Colors>
                <Color colorName="purple" />
                <Color colorName="pink" />
              </Colors>
            </Detail>
            <Detail Id="6">
              <Colors>
                <Color colorName="grey" />
                <Color colorName="orange" />
              </Colors>
            </Detail>
          </Details>
        </Item>
    
        <Item No="0003">
          <Details>
            <Detail Id="8">
              <Colors>
                <Color colorName="red" />
              </Colors>
            </Detail>
          </Details>
        </Item>
    
      </Items>
    </xml>`;
    
    const xmlDoc = new DOMParser().parseFromString(xml, 'application/xml');
    
    const search_id = "3";
    
    const foundNos = [];
    
    const ans = xmlDoc.evaluate(`//Item[Details/Detail/@Id="${search_id}"]/@No`, xmlDoc);
    
    var foundNode;
    while ((foundNode = ans.iterateNext()) != null)
      foundNos.push(foundNode.textContent);
      
    console.log(foundNos);

    我建议切换到基于 SaxonJS 的 XPath 3.1,这样可以更容易地使用一个 XPath 表达式收集数据并将其作为一个 JS 数组返回:

    const xml = `<xml>
      <Items>
    
        <Item No="0001">
          <Details>
            <Detail Id="3">
              <Colors>
                <Color colorName="green" />
                <Color colorName="yellow" />
              </Colors>
            </Detail>
          </Details>
        </Item>
    
        <Item No="0002">
          <Details>
            <Detail Id="3">
              <Colors>
                <Color colorName="purple" />
                <Color colorName="pink" />
              </Colors>
            </Detail>
            <Detail Id="6">
              <Colors>
                <Color colorName="grey" />
                <Color colorName="orange" />
              </Colors>
            </Detail>
          </Details>
        </Item>
    
        <Item No="0003">
          <Details>
            <Detail Id="8">
              <Colors>
                <Color colorName="red" />
              </Colors>
            </Detail>
          </Details>
        </Item>
    
      </Items>
    </xml>`;
    
    const xmlDoc = new DOMParser().parseFromString(xml, 'application/xml');
    
    const search_id = 3;
    
    const foundNos = SaxonJS.XPath.evaluate(`//Item[Details/Detail/@Id = $search_id]/@No/string()`, xmlDoc, { params : { search_id : search_id } });
    
    console.log(foundNos);
    &lt;script src="https://martin-honnen.github.io/Saxon-JS-2.5/SaxonJS2.js"&gt;&lt;/script&gt;

    SaxonJS 是 Saxonica 的产品,您可以下载它 here 并阅读它的文档 here

    【讨论】:

      猜你喜欢
      • 2018-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多