使用JAVA中的DOM解析器按ID获取元素

时间:2015-04-26 15:56:25

标签: java xml dom

我有一个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解析它以获取quote元素中包含属性cit的每个type="translation"值:

  • 我只需要拥有quote元素的文本内容,但我不需要拥有直接节点的文本内容,例如<quote>petits <hi rend="i">mpl</hi></quote>
  • 我不需要包含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 ???
                        }
                    }
                }
            }
        }

但我不知道如何访问<quote> ...

1 个答案:

答案 0 :(得分:1)

您可以完全按照访问<quote>元素的方式访问<cit>元素:使用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();
            ...
        }
    }
}

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

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