如何从java中删除XML文档中的XML标记

时间:2017-06-29 14:59:58

标签: java xml

如何从java中删除XML文档中的XML标记?

例如,我有以下XML:

<root>
  <item>
     <code>100001</code>
     <price>456</price>
     <name>ABC</name>
</item>
  <item>
     <code>100002</code>
     <price>123</price>
     <name>DEF</name>
</item>
  <item>
     <code>100003</code>
     <price>887</price>
     <name>XYZ</name>
</item>
</root>

我想从XML中删除price标签,并按以下方式生成XML:

<root>
      <item>
         <code>100001</code>
         <name>ABC</name>
    </item>
      <item>
         <code>100002</code>
         <name>DEF</name>
    </item>
      <item>
         <code>100003</code>
         <name>XYZ</name>
    </item>
    </root>

此外,要求是XML标签可以随着我从Web服务获取此信息而改变,这可以改变它发送的信息。

2 个答案:

答案 0 :(得分:1)

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.File;
import java.util.ArrayList;

public class JAXBExample {
    static Root root = new Root();
    public static void main(String[] args) throws JAXBException {
        File file = new File("C:\\file.xml");
        File file1 = new File("C:\\result.xml");
        JAXBContext jaxbContext = JAXBContext.newInstance(Root.class);

        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        Root rootEle = (Root) jaxbUnmarshaller.unmarshal(file);

        ArrayList<item> itemList =new ArrayList<>();
        for (int i = 0; i < rootEle.getItemList().size() ; i++){
            item itemLocal = new item();
            itemLocal.setCode(rootEle.getItemList().get(i).getCode());
            itemLocal.setName(rootEle.getItemList().get(i).getName());
            itemList.add(itemLocal);
        }
        root.setItemList(itemList);
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

        // output pretty printed
        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        jaxbMarshaller.marshal(root, file1);
        jaxbMarshaller.marshal(root, System.out);

    }
}

根类:

import org.apache.activemq.kaha.impl.data.Item;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.ArrayList;

@XmlRootElement(name = "root")
public class Root {

    public ArrayList<item> getItem() {
        return itemList;
    }

    public void setItem(ArrayList<item> item) {
        this.itemList = item;
    }

    private ArrayList<item> itemList;

}

Item calss:

public class item {
    public String getCode() {
        return code;
    }

    public void setCode(String code) {

        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    private String code;
    private String name;
}

我希望这会有所帮助。

答案 1 :(得分:0)

如评论所述,请考虑运行Identity Transform的XSLT以及要删除的节点上的空模板。没有for循环,if逻辑或使用此解决方案所需的数据结构(例如,arraylist,hashmaps)。

作为信息,XSLT是一种特殊目的语言(XPath的兄弟),旨在将xml文件转换为其他xml,html甚至文本文件(csv / txt)。 Java,PHP,Python等通用语言维护库以运行XSLT 1.0脚本,甚至可以调用libxslt / Saxon等外部专用XSLT处理器。此外,XSLT脚本本身是格式良好的XML文件,可以从文件或字符串中进行解析,以满足任何动态需求。

XSLT (另存为.xsl脚本,将在下面的Java文件中解析)

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>

  <!-- Identity Transform -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- Removes all price tags -->
  <xsl:template match="price"/>

</xsl:transform>

<强>爪哇

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import javax.xml.transform.*;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerException;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.OutputKeys;

import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;

import org.w3c.dom.Document;
import org.xml.sax.SAXException;

public class CourseList {
    public static void main(String[] args) throws IOException, URISyntaxException,
                                                  SAXException, 
                                                  ParserConfigurationException,
                                                  TransformerException {    
        // LOAD XML AND XSL DOCUMENTS
        String inputXML = "C:\\Path\\To\\Input.xml";
        String xslFile =  "C:\\Path\\To\\XSLTScript.xsl";
        String outputXML =  "C:\\Path\\To\\Output.xml";                                   

        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();            
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
        Document doc = docBuilder.parse (new File(inputXML));
        Source xslt = new StreamSource(new File(xslFile)); 

        // XSLT TRANSFORMATION WITH PRETTY PRINT
        TransformerFactory prettyPrint = TransformerFactory.newInstance();
        Transformer transformer = prettyPrint.newTransformer(xslt);

        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
        transformer.setOutputProperty(OutputKeys.STANDALONE, "yes");
        transformer.setOutputProperty(OutputKeys.METHOD, "xml");
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");                        

        DOMSource source = new DOMSource(doc);
        StreamResult result = new StreamResult(new File(outputXML));        
        transformer.transform(source, result);
    }
}