如何在不对标记名称进行硬编码的情况下从XML文件中删除XML标记 [英] How to delete a XML tag from XML file without Hard coding the tag Name

查看:95
本文介绍了如何在不对标记名称进行硬编码的情况下从XML文件中删除XML标记的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要使用Java删除XML文件中的所有 OBJECT 标记.当我直接将父标记名( SPAN )输入到源代码("span")中时,我可以删除 OBJECT 标记,但是我需要删除没有硬代码的标签父标签.如果我进行硬编码,则只能删除 span 标记内的 Object标记.我需要在XML中删除所有 ,即使它可能在另一个父标记中,而在源代码中没有硬代码父标记的情况下.我需要删除示例XML文件中的 span 标签和 score 标签中所有可用的 Object 标签.对于示例XML文件,请查看下面的图片.

I need to delete all OBJECT TAG in XML file using Java. I can able to delete the OBJECT Tag when I enter parent Tag Name(SPAN) directly Hard code into the source code("span"), But I need to delete the Tag without hard code Parent Tag. If I hard code, I can able to delete only the Object Tag inside span Tag. I need to delete all the in XML even it may be inside another parent Tag, Without Hard code the Parent tag in Source code. I need to delete all Object tag available inside both span tag and also score tag in Sample XML File. For Sample XML File view the below Image.

Java程序

public class XmlObject {

public static void main(String[] args) {
    String filePath = "/Users/myXml/Sample.xml";
    File xmlFile = new File(filePath);
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder;
    try {
        dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(xmlFile);
        doc.getDocumentElement().normalize();
        deleteElement(doc);
        doc.getDocumentElement().normalize();
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(doc);
        StreamResult result = new StreamResult(new File("/Users/myXml/Sample_ObjDelete.xml"));
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.transform(source, result);
        System.out.println("XML file updated successfully");

    } catch (SAXException | ParserConfigurationException | IOException | TransformerException e1) {
        e1.printStackTrace();
    }
}

private static void deleteElement(Document doc) {
    NodeList RootElement = doc.getElementsByTagName("assessmentItem");

    int getRootElementLength = RootElement.getLength();

        System.out.println("getRootElementLength "+getRootElementLength);

        for(int k = 0; k < getRootElementLength; k++){
            System.out.println("2");
            Node nNode = RootElement.item(0);

            Element eElement = (Element) nNode;
            NodeList object = eElement.getElementsByTagName("span");
            Element obj = null;


    for(int i=0; i<object.getLength();i++){
        obj = (Element) object.item(i);
        int leng = obj.getElementsByTagName("object").getLength();
            System.out.println("object:" +leng);
            for(int j=0; j<leng;j++){
                Node objectNode = obj.getElementsByTagName("object").item(k);
                (obj).removeChild(objectNode);
            }
    }
    }

}

}

<qualityTest>
<responseDeclaration>
<correctResponse>
<value>QualityTest</value>
</correctResponse>
</responseDeclaration>
<itemBody>
<sampleTest>
<p>Who is president of uganda?</P>
<span>
<object>
Yoweri Museveni</object>
<span>
<object>
Raúl Castro
</Object>
</span>
</sampleTest>
</itemBody>
<score>
<object>
Yingluck Shinawatra
</Object>
</score>
</qualityTest> 

推荐答案

您应以递归方式遍历xml树,并删除所有对象元素的所有出现情况:

You should walk the xml-tree recursively and remove all occurencies of any object element:

private static void deleteElement(Node someNode) {
    NodeList childs = someNode.getChildNodes();
    for (int i = 0; i < childs.getLength();) {
        Node child = childs.item(i);
        if (child.getNodeType() == Document.ELEMENT_NODE) {
            if (child.getNodeName().equalsIgnoreCase("object")) {
                child.getParentNode().removeChild(child);
                continue;
            } else {
                deleteElement(child);
            }
        }
        i++;
    }
}

此小代码段将删除树的任何深度的所有名为"object"的xml标签.

This little code snippet will remove any xml-tag named "object" in any depth of the tree.

这篇关于如何在不对标记名称进行硬编码的情况下从XML文件中删除XML标记的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆