有 Java 编程相关的问题?

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

如何在JAVA中向XML字符串中添加新属性?条件:基于父键,如果需要解析或SAX,我只能使用JAVA内部api

我有一个xml字符串

<aa>
    <bb>
        <cc>
            <cmd>
                <efg sid="C1D7B70D7AF705731B0" mid="C1D7D7AF705731B0" stid="-1" dopt="3">
                    <pqr>
                        <dru fo="1" fps="1" nku="WBECDD6CC37656E6C9" tt="1"/>
                        <dpo drpr="67" dpi="16"/>
                        <dres >
                            <dre dreid="BB:8D679D3511D3E4981000E787EC6DE8A4:1:1:0:2:1" fa="1" dpt= "1" o="0"/>
                        </dres>
                    </pqr>
                </efg>
            </cmd>
        </cc>
    </bb>
</aa>

我需要在<efg>标记中添加“login”属性。因此,新的XML将是

<aa>
    <bb>
        <cc>
            <cmd>
                <efg sid="C1D7B70D7AF705731B0" login="sdf34234dfs" mid="C1D7D7AF705731B0" stid="-1" dopt="3">
                    <pqr>
                        <dru fo="1" fps="1" nku="WBECDD6CC37656E6C9" tt="1"/>
                        <dpo drpr="67" dpi="16"/>
                        <dres >
                            <dre dreid="BB:8D679D3511D3E4981000E787EC6DE8A4:1:1:0:2:1" fa="1" dpt= "1" o="0"/>
                        </dres>
                    </pqr>
                </efg>
            </cmd>
        </cc>
    </bb>
</aa>

条件是:

  1. 我只能使用内置JavaAPI(Java8)或SAX解析器或xmlbuilder
  2. Add条件基于父标记,即需要检查<cmd>,然后在子标记中需要添加<login>,因为它不确定<efg>标记是否总是存在,并且具有相同的名称,它可以具有任何名称

我用下面的代码尝试了DOM解析器

String xml = "xmlString";
        //Use method to convert XML string content to XML Document object
        Document doc = convertStringToXML( xml );
        doc.getDocumentElement().normalize();

        Node m = doc.getElementsByTagName("cmd").item(0).getFirstChild();
        Attr login = doc.createAttribute("login");
        login.setValue("123567");
        m.appendChild(login);

然而,我在最后一行代码中遇到了以下错误

Exception in thread "main" org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: An attempt was made to insert a node where it is not permitted.

请任何人建议我,如何添加新的属性login到基于我的条件2


共 (1) 个答案

  1. # 1 楼答案

    NodeList nodeList = doc.getElementsByTagName("cmd");
                        //Check <cmd> tag is present and then check <cmd> tag has child nodes
                        if (nodeList != null && nodeList.item(0).hasChildNodes()) {
                            //Get first child node of <cmd> xml tag
                            String nodeName = doc.getElementsByTagName("cmd").item(0).getFirstChild().getNodeName();
    
                            NodeList childNodeList = doc.getElementsByTagName(nodeName);
                            Element el = (Element) childNodeList.item(0);
                            //set pgd_login attribute with respective value
                            el.setAttribute("login", "xyz");
    
                            //Convert back into xml string from Document
                            xml = XMLHelpers.TransformDOMDocumentToString(doc);
                        }