当前位置: 首页 > 面试题库 >

Java DOM-依次插入一个元素

王棋
2023-03-14
问题内容

给定以下XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<process
    name="TestSVG2"
    xmlns="http://www.example.org"
    targetNamespace="http://www.example.org"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <sequence>
      <receive name="Receive1" createInstance="yes"/>
      <assign name="Assign1"/>
      <invoke name="Invoke1"/>
      <assign name="Assign2"/>
      <reply name="Reply1"/>
   </sequence>
</process>

我想<sequence></sequence> 在某个预先存在的元素之后 添加一个新 元素
。例如,如果要在之后添加节点"Assign1",则新的XML应该如下所示:

   <sequence>
      <receive name="Receive1" createInstance="yes"/>
      <assign name="Assign1"/>
      <newtype name="NewNode"/>
      <invoke name="Invoke1"/>
      <assign name="Assign2"/>
      <reply name="Reply1"/>
   </sequence>

我必须通过在函数中使用Java DOM来执行此操作。函数签名应如下所示:

 public void addActionDom(String name, String stepType, String stepName)

哪里:

  • name 是预先存在的元素,之后将进行插入;
  • stepType 是插入的元素类型;
  • stepName 是新插入的元素的名称属性。

目前,我缺乏JDOM或任何其他Java XML库的经验。 您能提供一个示例代码,还是将我指向一个在某个元素后插入的教程。

这是我到目前为止的代码:

    public void addActionDom(String name, String stepType, String stepName) {
        File xmlFile = new File(path + "/resources/" + BPELFilename);
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db;
        try {
            /* Load XML */
            db = dbf.newDocumentBuilder();
            Document doc = db.parse(xmlFile);
            doc.getDocumentElement().normalize();

            /* Iterate throughout the type tags and delete */
            for (String cTag : typeTags) {
                NodeList cnl = doc.getElementsByTagName(cTag);
                for (int i = 0; i < cnl.getLength(); ++i) {
                    Node cnode = cnl.item(i);
                    if (cnode.getNodeType() == Node.ELEMENT_NODE) {
                        Element elem = (Element)cnode; // 'elem' Element after which the insertion should be made
                        if (elem.getAttribute("name").equals(name)) { 
                            Element newElement = doc.createElement(stepType); // Element to be inserted 
                            newElement.setAttribute("name", stepName);
                            // CODE HERE
                        }
                    }
                }
            }

            /* Save the editing */
            Transformer transformer =
                TransformerFactory.newInstance().newTransformer();
            StreamResult result =
                new StreamResult(new FileOutputStream(path + "/resources/" +
                                                      BPELFilename));
            DOMSource source = new DOMSource(doc);
            transformer.transform(source, result);
        } catch (Exception e) {
            /* ParserConfigurationException */
            /* SAXException */
            /* IOException */
            /* TransformerConfigurationException */
            /* TransformerException */
            /* Exception */
            e.printStackTrace();
        }
    }
}

问题答案:

好吧,亚伦·迪古拉(Aaron
Digulla)在速度上击败了我。也必须自己弄清楚。我没有使用cnl.item(i+1)但是nextSibling()

Element newElement = doc.createElement(stepType); // Element to be inserted 
newElement.setAttribute("name", stepName);
elem.getParentNode().insertBefore(newElement, elem.getNextSibling());

您不能在指定的索引处插入节点。唯一的节点插入方法是

appendChild(Node node) //appends the given child to the end of the list of children

insertBefore(Node new, Node child) //inserts "new" into the list, before the 'child' node.

如果有insertAfter(Node new,Node child)方法,这对您来说将非常容易。但不幸的是,没有。



 类似资料:
  • 问题内容: 我知道一次插入多个数据效率更高: 在golang中该怎么做? 使用字符串拼接,但这不是很好。db.Prepare更安全吧? 我需要一个功能更安全,更高效的函数,一次插入多个数据。 问题答案: 为什么不这样呢?(在此处编写但未进行测试,因此可能存在语法错误):

  • 我是Vaadin和Java的新手,我正在处理以下问题: 在下面的代码中,我想在ArrayList“newList”中添加多个元素。如你所见,名为“ps”的元素有5个子元素。 问题是,在ArrayList中添加的当前(循环中的)元素替换了每个索引中所有先前的元素,结果它最终只返回最后一个“ps”元素,循环发生的次数是多少。 和代码:

  • 我将一行一行地插入数据,但我在某处听说,如果有许多数据要插入,则需要很多时间。那么,如何一次将它们全部插入?

  • 我不熟悉Scala中的单元测试,我找不到一种方法来存根单例对象中定义的函数。 例如: 我试图对Profile类中定义的函数进行单元测试。因为我不想在单元测试中通过web实际访问外部API,所以我尝试存根对象及其函数以返回一些预定义的值。 我研究了ScalaMock、EasyMock和Mockito框架,但找不到一种方法来存根单例对象的方法。ScalaMock状态 为什么所有的模拟框架都不提供这种功

  • 问题内容: 有没有一种pythonic方式将元素插入字符串中的每个第二个元素? 我有一个字符串:“ aabbccdd”,我希望最终结果是“ aa-bb-cc-dd”。 我不确定该怎么做。 问题答案: 假设字符串的长度始终是偶数, 该也可以消除 算法是将字符串分组为对,然后将其与字符连接在一起。 代码是这样写的。首先,它分为奇数位和偶数位。 然后使用该函数将它们组合成一个可迭代的元组。 但是元组不是

  • 问题内容: 我正在尝试找到一种方法来加载JSON页面以显示我当前拥有的内容。但是我试图在每个元素中逐渐消失吗?有谁熟悉这样做的方法吗? 淡入淡出每个元素的时间? 这是我的代码示例,我正在使用jquery框架。 代码:http://pastie.org/343896 问题答案: 好了,您可以设置淡入淡出功能来触发“下一个”。 但是计时器可能是一个更好的系统,或者是将它们全部收集,将它们放入一个数组中