有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

比较xml元素的文本内容,并将子元素添加到Java中的特定节点

我有一个arraylist,其中包含标题和全名,格式如下

Dr.|ricardo bettati
Prof. Dr.-Ing.|Helmut sperling
miss|angela link

首先,我用|拆分内容。我会得到标题和全名。然后我用空格分割全名,得到firstnamefamilyname.

现在我有3根弦

字符串标题\包含上述列表中的标题 字符串名; 字符串家族名称

下一个任务是用上面的字符串firstnamefamilyname检查现有xml的文本内容。下面是现有的xml

<person>
 <name>
   <firstname>Jean-Luc</firstname>
   <familyname>DeLorme</familyname>
 </name>
</person>
<person>
 <name>
   <firstname>Dave</firstname>
   <familyname>Sperling</familyname>
 </name>
</person>
<person>
 <name>
    <firstname>Helmut</firstname>
    <familyname>sperling</familyname>
 </name>
</person>

如果firstnamefamilyname内容与上述xml元素的文本内容<firstname><familyname>匹配,那么我必须创建一个名为<title>的元素,并从列表中附加相应的标题。我的XML应该如下所示

<person>
 <name>
   <firstname>Jean-Luc</firstname>
   <familyname>DeLorme</familyname>
 </name>
</person>
<person>
 <name>
   <firstname>Dave</firstname>
   <familyname>Sperling</familyname>
 </name>
</person>
<person>
 <name>
    **<title>Prof. Dr.-Ing.>/title>**
    <firstname>Helmut</firstname>
    <familyname>sperling</familyname>
 </name>
</person>

我已尝试使用以下代码

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setValidating(false);
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new FileInputStream(new File("Final-Results.xml")));
        Element element =  doc.getDocumentElement();
        NodeList list = doc.getElementsByTagName("person");
        for (int i=0;i<titles.size();i++) { //Title is my arraylist
            String names = (String) titles.get(i);
            String[] content=names.split("\\|");
            String title=content[0];
            String[] fullname=content[1].split("\\s+");
            String firstname=fullname[0];
            String familyname=fullname[1];
            for (int n = 0; n < list.getLength(); n++) {

                   Node node = list.item(n);
                   if ("firstname".equals(node.getNodeName()) && node.getTextContent().equals(firstname)) {
                    System.out.println("haii");
                   }
            }
        }

但我如何获取子节点、检查文本内容并在特定位置创建节点呢


共 (1) 个答案

  1. # 1 楼答案

    Child node appending:
        Element childElement = doc.createElement("title");
        // set attributes, etc
        node.appendChild(childElement);
    

    可以使用xPath简化代码,如:

        String xPathExpression = "*/person/name[firstname/text() = 'Helmut' and familyname/text() = 'sperling']";
        XPath path = XPathFactory.newInstance().newXPath();
        NodeList nl = (NodeList) path.evaluate(xPathExpression, doc, XPathConstants.NODESET);
        for (int i = 0; i < nl.getLength(); i++) {
            Element childElement = doc.createElement("title");
            childElement.appendChild(doc.createTextNode("Dr."));
            nl.item(i).insertBefore(childElement,((Element)nl.item(i)).getFirstChild());
        }
    

    如果在指定的示例上运行代码,结果是:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?><result>
    <person>
     <name>
       <firstname>Jean-Luc</firstname>
       <familyname>DeLorme</familyname>
     </name>
    </person>
    <person>
     <name>
       <firstname>Dave</firstname>
       <familyname>Sperling</familyname>
     </name>
    </person>
    <person>
     <name><title>Dr.</title>
        <firstname>Helmut</firstname>
        <familyname>sperling</familyname>
     </name>
    </person>
    </result>