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

如何在Java中的某些元素之后/之前将元素插入xml

宦兴朝
2023-03-14
问题内容

这是我的代码,也许您会立即注意到我所缺少的内容:

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse(fileName));

XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile("//CustomerId");

Object result = expr.evaluate(doc, XPathConstants.NODESET);
Nodelist nodes = (NodeList) result;
Text a = doc.createTextNode("value");
Element p = doc.createElement("newNode");
p.appendChild(a);

for (int i = 0; i < nodes.getLength(); i++) {
    nodes.item(i).insertBefore(p, nodes.item(i));
}

我正在尝试<newNode>value</newNode>在CustomerId现有节点之前插入新的node()。这是我的XML示例文件:

<Customer>
    <names>
        <firstName>fName</firstName>
        <lastName>lName</lastName>
        <middleName>nName</middleName>
        <nickName/>
    </names>
    <addressList>
        <address>
            <streetInfo>
                <houseNumber>22</houseNumber>
                <baseName>Street base name</baseName>
                <district>kewl district</district>
            </streetInfo>
            <zipcode>22231</zipcode>
            <state>xxx</state>
            <country>xxxz</country>
            <primary>true</primary>
        </address>
    </addressList>
    <CustomerId/>
    <SSN>561381</SSN>
    <phone>
        <homePhone>123123123</homePhone>
        <officePhone/>
        <homePhone>21319414</homePhone>
    </phone>
    <preferred>true</preferred>
</Customer>

这是一个抛出异常,我只是不知道还能尝试什么:

NOT_FOUND_ERR:尝试在不存在的上下文中引用该节点。


问题答案:

在这里,我只是使用您提供的xml示例进行了测试的示例。

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 
domFactory.setIgnoringComments(true);
DocumentBuilder builder = domFactory.newDocumentBuilder(); 
Document doc = builder.parse(new File("XmlTest.xml"));

NodeList nodes = doc.getElementsByTagName("CustomerId");

Text a = doc.createTextNode("value"); 
Element p = doc.createElement("newNode"); 
p.appendChild(a);

nodes.item(0).getParentNode().insertBefore(p, nodes.item(0));

结果如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Customer>
    <names>
        <firstName>fName</firstName>
        <lastName>lName</lastName>
        <middleName>nName</middleName>
        <nickName/>
        </names>
    <addressList>
        <address>
            <streetInfo>
                <houseNumber>22</houseNumber>
                <baseName>Street base name</baseName>
                <district>kewl district</district>
                </streetInfo>
            <zipcode>22231</zipcode>
            <state>xxx</state>
            <country>xxxz</country>
            <primary>true</primary>
            </address>
        </addressList>
    <newNode>value</newNode>
<CustomerId/>
    <SSN>561381</SSN>
    <phone>
        <homePhone>123123123</homePhone>
        <officePhone/>
        <homePhone>21319414</homePhone>
        </phone>
    <preferred>true</preferred>
</Customer>

如果您有兴趣,这是我用来显示结果的示例代码:

Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");

StreamResult result = new StreamResult(new StringWriter());
DOMSource source = new DOMSource(doc);
transformer.transform(source, result);

String xmlOutput = result.getWriter().toString();
System.out.println(xmlOutput);


 类似资料:
  • 假设我有这样的html: 我只想获得之前的 。有没有办法用JSOUP做到这一点呢?我知道我可以把所有的宠物都弄成这样: 但这也包括额外的宠物。我想知道我是只能选择上面的宠物还是只是删除下面的宠物然后使用那个代码?

  • 问题内容: 假设我有一个这样的Python清单: 我想在每个第n个元素后插入一个“ x”,比方说该列表中的三个字符。结果应为: 我知道我可以通过循环和插入来做到这一点。我实际上正在寻找的是Pythonish方式,也许是单线? 问题答案: 我有两个一线客轮。 鉴于: 使用获得指数,增加每3次字母, 如 :,然后连接成字符串和它。 [‘a’, ‘b’, ‘c’, ‘x’, ‘d’, ‘e’, ‘f’,

  • 给定以下标记: 如何在。分隔符后选择类。first和。second?我尝试了以下几点: 然而,这似乎并不奏效。我以为这是这样的,从左到右: 既然它不能工作,我想我误解了其中一个选择器的功能。感谢任何帮助(或这方面的替代方案)。 PS: 标记来自外部源。虽然我可以在技术上用JS添加一个类,但如果可能的话,我更倾向于不添加。我也尝试过使用“:not”选择器,但我也没有得到它的工作。 谢谢 编辑: 在屏

  • 问题内容: 我想使用一个开关在网页上放置段落标签。 我使用after伪元素: 现在,我需要从页面中删除此CSS代码。 如何轻松做到这一点? 我要补充一点: jQuery已在页面上使用 而且我不想包含或删除包含CSS的文件。 问题答案: p:after { content: none; } none 是将内容(如果指定)设置为 空 的官方值。

  • 问题内容: 我觉得我看到了一种使用CSS content属性在元素之前插入换行标记的方法。显然这是行不通的: 但是你怎么做呢? 问题答案: 可以在伪元素生成的内容中使用 转义序列。。 您可能还需要添加到。 注意:表示一行的结尾。 ps另一种治疗方法是

  • 长话短说,我在掷不公平的骰子,并试图在x个骰子数之后找到任何给定和的概率。实际上有数百张脸和数百个卷轴,所以我不能简单地找到所有可能的组合,然后找到概率,列出大小和内存限制。 我通过寻找所有可能的组合以及它们一次发生一次滚动的概率来解决这个问题。在我找到所有可能的组合和每个组合的概率后,我需要通过将组合的概率与相同的总和相结合来压缩它。 想想组合(1,3)和(2,2)都是唯一的组合,但是它们都有4