【问题标题】:get Element by ID using DOM parser in JAVA在 JAVA 中使用 DOM 解析器按 ID 获取元素
【发布时间】:2015-04-26 15:56:24
【问题描述】:

我有一个结构如下的 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<entry id="young_1">
  <sense n="1">
     <cit type="translation" lang="fr">
        <quote>jeune</quote>
      </cit>
      <re type="phr">
         <sense>
           <cit type="translation" lang="fr">
              <quote>un jeune homme</quote>
           </cit>
          </sense>
      </re>
  </sense>
  <sense n="2">
    <cit type="translation" lang="fr">
        <quote>petits
            <hi rend="i">mpl</hi>
        </quote>
  </sense>
</entry>

我需要使用 JAVA 对其进行解析,以获取 cit 元素中包含的每个 quote 值,该元素具有 type="translation" 属性:

  • 我只需要quote元素的文本内容,但不需要&lt;quote&gt;petits &lt;hi rend="i"&gt;mpl&lt;/hi&gt;&lt;/quote&gt;等直接节点的文本内容
  • 我不需要将quote 元素的文本内容包含在re 元素中

最后我需要得到这个结果:

entry ==> young_1
  translations ==> [jeune;petits]

现在我的 JAVA 代码是:

    //load xml document for DOM parsing
    Document doc = loadXMLFromString(xmlContent);

    //now try to parse it
    NodeList nList = doc.getElementsByTagName("sense");
    for (int i = 0; i < nList.getLength(); i++) {
        Node nNode = nList.item(i);
            if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                Element eElement = (Element) nNode;
                NodeList fieldNodes = eElement.getElementsByTagName("cit");
                for(int j = 0; j < fieldNodes.getLength(); j++) {
                    Node fieldNode = fieldNodes.item(j);
                    NamedNodeMap attributes = fieldNode.getAttributes();
                    Node attr = attributes.getNamedItem("type");
                    if(attr != null) {
                        if(attr.getTextContent().equals("translation")) {
                            //how can I access <quote> element ???
                        }
                    }
                }
            }
        }

但我不知道如何访问&lt;quote&gt;...

【问题讨论】:

    标签: java xml dom


    【解决方案1】:

    您可以像访问&lt;cit&gt; 元素一样访问&lt;quote&gt; 元素:使用Element#getElementsByTagName(String name) 方法:

    Node attr = attributes.getNamedItem("type");
    if (attr != null) {
        if (attr.getTextContent().equals("translation")) {
            Element citElement = (Element) fieldNode;
            NodeList quoteNodeList = citElement.getElementsByTagName("quote");
            if(quoteNodeList.getLength() > 0) {
                Node quoteNode = quoteNodeList.item(0);
                String quote = quoteNode.getTextContent();
                ...
            }
        }
    }
    

    为了排除&lt;re&gt;节点中包含的节点,您可以使用nNode.getParentNode().getNodeName()检查&lt;sense&gt;节点的父节点,例如:

     if (!nNode.getParentNode().getNodeName().equals("re")) {
           ....
     }
    

    【讨论】:

    • 效果不错,但我只需要获取文本内容jeunepetits。我已经修改了我的初始答案以详细说明我的示例。
    • 为了解决quote 元素的问题,我使用了String quote = quoteNode.getFirstChild().getTextContent();,但现在我总是遇到re 中包含的cit 元素的问题
    • @ChesterMcAllister 基本上,您的程序可以获取名称为cit 的所有节点并检查它们的“祖父”节点是否不是re 节点(使用方法Node#getParentNode())。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    相关资源
    最近更新 更多