这就是我所拥有的
<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>
Run Code Online (Sandbox Code Playgroud)
我想让用户能够上下移动某个图像,因为它们存储在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>
Run Code Online (Sandbox Code Playgroud)
我的尝试:
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());
}
}
Run Code Online (Sandbox Code Playgroud)
使用Node.insertBefore和/或Node.appendChild
仅找到要移动的节点,并找到应移动的位置,然后在该节点之前插入该节点。
您可能更容易创建要移动的节点的副本,将其插入正确的位置,然后再删除旧节点。
请参见下面的示例代码:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
它将移动属性等于第一个pose元素的元素。image_id3
小智 5
您不需要复制/克隆节点。
只需执行以下操作:
public void addNodeAfter(Node newNode, Node refChild) {
Node parent = refChild.getParent();
parent.insertBefore(newNode, refChild);
refChild = parent.remove(refChild);
parent.insertBefore(refChild, newNode);
}
Run Code Online (Sandbox Code Playgroud)
可能比克隆更好。
| 归档时间: |
|
| 查看次数: |
4391 次 |
| 最近记录: |