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

Java 在xml解析中按标记名获取元素,不包括某些父级的子级,java,xml,Java,Xml,我有一个正在解析的xml文件。虽然有些标记名出现了多次,但都是在不同的父名称下出现的。我知道我想忽略哪位家长的孩子。我该怎么做 <sub-article id="S01" article-type="translation" xml:lang="pt"> <front-stub> <article-categories> <subj-group subj-group-type="heading">

我有一个正在解析的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>
只需在“子文章”节点下搜索“标题组”节点:

List allTitleGroupNodes=new ArrayList();
NodeList subticlenodes=document.getElementsByTagName(“子文章”);
对于(int i=0;i

(旁白:
NodeList的糟糕界面是我最讨厌在标准Java中处理XML的地方之一。)

使用XPath有两种方法来实现它:

  • 包括目标元素名称
  • 排除目标元素名称
  • 就我个人而言,我更喜欢第一个,因为它更显式,并且总是面向不同的XML文件

    溶液1夹杂物 使用XPath仅选择
    下的元素:

    爪哇:

    解决方案2排除 如果元素在
    下,则使用XPath排除这些元素。我假设XML根元素是
    (如果不是这样,请证明代码正确):

    爪哇

    NodeList titleNodeList = document.getElementsByTagName("title-group");
    
    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));
        }
    }
    
    //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);
    
    /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);