代码之家  ›  专栏  ›  技术社区  ›  user1631306

在XML分析中按标记名获取元素,不包括某些父级的子级

  •  1
  • user1631306  · 技术社区  · 8 年前

    我有一个正在分析的XML文件。尽管有些标记名在不同的父名称下发生了多次。我知道我想忽略哪个家长的孩子。我该怎么做?

     <sub-article id="S01" article-type="translation" xml:lang="pt">
      <front-stub>
         <article-categories>
            <subj-group subj-group-type="heading">
               <subject>Artigos Originais</subject>
            </subj-group>
         </article-categories>
         <title-group>
            <article-title>
               Prevalência de deficiência nutricional em pacientes com
                tuberculose pulmonar
               <xref ref-type="fn" rid="fn02">*</xref>
            </article-title>
         </title-group>
       </front-stub>
      </article-categories>
     </sub-article>        
        .....
        .....
     <article-meta>
         <article-id pub-id-type="pmid">24068270</article-id>
         <article-id pub-id-type="pmc">4075858</article-id>
         <article-id pub-id-type="publisher-id">S1806-37132013000400012</article-id>
         <article-id pub-id-type="doi">10.1590/S1806-37132013000400012</article-id>
         <article-categories>
            <subj-group subj-group-type="heading">
               <subject>Original Articles</subject>
            </subj-group>
         </article-categories>
         <title-group>
            <article-title>
               Prevalence of nutritional deficiency in patients with
               pulmonary tuberculosis
               <xref ref-type="fn" rid="fn01">*</xref>
            </article-title>
         </title-group>
        <article-meta>
    

    在这个例子中,我不想处理子文章标签下的子项。因此,“文章标题”只能用于“肺结核患者营养缺乏的患病率”,而不能用于“肺结核患者营养缺陷的患病率”,而不是“肺结核患者营养缺陷的患病率”。

    我目前正在跟踪代码,它将返回所有名为“标题组”的节点。我怎样才能把它具体化,这样我就不会从某个父母那里得到它。

    NodeList titleNodeList = document.getElementsByTagName("title-group");
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   Mincong Huang    8 年前

    有两种方法可以使用xpath实现它:

    1. 包括目标元素名称 <article-meta>
    2. 排除目标元素名称 <sub-article>

    就我个人而言,我更喜欢第一个,因为它更明确,并且总是面对不同的XML文件工作。

    溶液1包合

    使用xpath只选择其下的元素 <文章meta> :

    //article-meta//title-group
    

    爪哇:

    XPath xPath = XPathFactory.newInstance().newXPath();
    XPathExpression expr = xPath.compile("//article-meta//title-group");
    NodeList titleNodes = (NodeList) expr.evaluate(document, XPathConstants.NODESET);
    

    解决方案2排除

    如果元素位于 <子条款 . 我假设XML根元素是 <article> (如果不是这样,请证明代码的合理性):

    /article/*[not(self::sub-article)]//title-group
    

    爪哇

    XPath xPath = XPathFactory.newInstance().newXPath();
    XPathExpression expr = xPath.compile("/article/*[not(self::sub-article)]//title-group");
    NodeList titleNodes = (NodeList) expr.evaluate(document, XPathConstants.NODESET);
    
        2
  •  1
  •   DavidW    8 年前

    只需搜索“子文章”节点下的“标题组”节点:

    List<Node> allTitleGroupNodes = new ArrayList<>();
    NodeList subArticleNodes = document.getElementsByTagName("sub-article");
    for (int i = 0; i < subArticleNodes.getLength(); i++) {
        NodeList titleNodes = subArticleNodes.item(i).getElementsByTagName("title-group");
        for (int j = 0; j < titleNodes.getLength(); j++) {
            allTitleGroupNodes.add(titleNodes.item(j));
        }
    }
    

    (旁白:可怕的界面 NodeList 是在标准Java中处理XML最讨厌的事情之一。