微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用XML Java DOM重新排序节点

这是我的,

<animation_state>
<state>run</state>
<animation_sequence>
<pose duration="10" image_id="1"/>
<pose duration="10" image_id="2"/>
<pose duration="10" image_id="3"/>
</animation_sequence>

我想让用户能够上下移动某个图像,但是,因为它们以XML格式存储,这意味着我必须更改图像ID.如果假设用户想要image_id = 3,成为序列中的第一个,或者在中间,或者根据他的需要在哪里,我该如何操作XML?我正在使用DOM.

如果用户想要第3个图像,那么这就是我的XML应该出现的方式:

<animation_state>
<state>run</state>
<animation_sequence>
<pose duration="10" image_id="3"/>
<pose duration="10" image_id="1"/>
<pose duration="10" image_id="2"/>
</animation_sequence>

我的尝试:

Document dom = parser.getDocument();
for (int i = 0; i < dom.getElementsByTagName("animation_state").getLength(); i++) 
{
    if (dom.getElementsByTagName("animation_state").item(i).getChildNodes().item(0).getTextContent().equalsIgnoreCase(target)) {
        posVal = i;
    }
}
NodeList list = dom.getElementsByTagName("animation_sequence").item(posVal).getChildNodes();

for(int b=0; b<list.getLength(); b++)
{
    if(list.item(b).getAttributes().item(1).getNodeValue().equalsIgnoreCase(PoseSelectionListener.imageIDOfSelectedPose))
    {
        Node toBeMoved = list.item(b);
        dom.getElementsByTagName("animation_sequence").item(posVal).appendChild(toBeMoved);
        System.out.println(toBeMoved.getAttributes().item(0).getNodeName());
    }
}

解决方法

使用 Node.insertBefore和/或 Node.appendChild
只需找到要移动的节点并找到它应该移动的位置,然后在其前面插入该节点.

您可以更轻松地移动节点的create a copy,将其插入正确的位置,然后将其插入delete the old node.

请参阅以下示例代码

public class SO13782330 {
    /** Move the image whose imageId is given at first position in sequence */
    public static void moveImageFirst(Document doc,int imageId) throws Exception {
        XPath xpath = XPathFactory.newInstance().newXPath();
        // get the image to move
        XPathExpression poseXPath = xpath.compile("//pose[@image_id='" + imageId + "']");
        Node pose = (Node)poseXPath.evaluate(doc,XPathConstants.NODE);
        // get the first image
        XPathExpression firstPoseXPath = xpath.compile("//pose[position() = 1]");
        Node firstPose = (Node)firstPoseXPath.evaluate(doc,XPathConstants.NODE);
        // copy the image to be moved
        Node posecopy = pose.cloneNode(true);
        // insert it before the first one
        Node sequence = firstPose.getParentNode();
        sequence.insertBefore(posecopy,firstPose);
        // delete the old one
        sequence.removeChild(pose);
    }

    /** Print the document on stdout */
    public static void showDocument(Document doc) throws Exception {
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.setoutputProperty(OutputKeys.OMIT_XML_DECLaraTION,"yes");
        StringWriter sw = new StringWriter();
        transformer.transform(new DOMSource(doc),new StreamResult(sw));
        System.out.println(sw.getBuffer().toString());
    }

    public static void main(String... args) throws Exception {
        DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document doc = db.parse(new InputSource(new StringReader("<animation_state>\n" +
                "<state>run</state>\n" +
                "<animation_sequence>\n" +
                "<pose duration=\"10\" image_id=\"1\"/>\n" +
                "<pose duration=\"10\" image_id=\"2\"/>\n" +
                "<pose duration=\"10\" image_id=\"3\"/>\n" +
                "</animation_sequence>\n" +
                "</animation_state>")));
        moveImageFirst(doc,3);
        showDocument(doc);
    }
}

它将在第一个之前移动具有image_id属性等于3的pose元素.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。