如何使用XML Java DOM重新排序节点
发布时间:2020-12-16 23:18:09 所属栏目:百科 来源:网络整理
导读:这是我的, animation_statestaterun/stateanimation_sequencepose duration="10" image_id="1"/pose duration="10" image_id="2"/pose duration="10" image_id="3"//animation_sequence 我想让用户能够上下移动某个图像,但是,因为它们以XML格式存储,这意味着
这是我的,
<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元素. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |