java - 在xml解析中通过标签名称获取元素,排除某些父项的子项

标签 java xml

我有一个正在解析的 xml 文件。尽管某些标签名称碰巧在不同的父名称下多次出现。我知道我想忽略哪位 parent 的 child 。我怎样才能做到这一点?

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

在这个例子中,我不想处理子文章标签下的子项。因此,“文章标题”将仅针对“肺结核患者营养缺乏的患病率”进行处理,而不是“Prevalência de deficiência nutricional em pacientes com tuberculose pulmonar”

我目前正在跟踪代码,该代码返回我所有名为“title-group”的节点。我怎样才能使其具体,这样我就不会从某些父节点那里获取它。

NodeList titleNodeList = document.getElementsByTagName("title-group");

最佳答案

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

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

我个人更喜欢第一个,因为它更明确并且始终适用于不同的 XML 文件。

解决方案 1 包含

使用 XPath 仅选择 <article-meta> 下的元素:

//article-meta//title-group

Java:

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

解决方案2排除

使用 XPath 排除 <sub-article> 下的元素。我假设 XML 根元素是 <article> (如果不是这样,请证明代码的合理性):

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

Java

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

关于java - 在xml解析中通过标签名称获取元素,排除某些父项的子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50591626/

相关文章:

java - 使用 activemq 添加 camunda-bpm-wildfly 并在同一个 docker 容器中运行

java - 在java中执行jar文件

c# - 我可以从我将要读取的 xml 文件创建一个 XmlNamespaceManager 对象吗?

Java 解析器测试

javascript - jQueryeach();生成 html 元素仅返回最后一个值

Java使用replaceAll和转义字符串

java - java.time.LocalDate 参数在 hibernate 查询中作为 java.util.Date 处理

java - 创建 Java 应用程序以作为 Windows 服务运行

java - 请放心,代码在 java API 中给出 503 响应,但在 POSTMAN 中工作正常

java - JAXB 为没有内容的标签设置一个值