繁体   English   中英

如何从Java中的XML文档删除XML标签

[英]How do I delete XML tags from XML document in java

如何从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中删除价格标签,并以以下方式生成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>

另外,要求是当我从Web服务获取此信息时XML标记可以更改,该Web服务可以更改其发送的信息。

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;

}

项目成绩:

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;
}

我希望这将有所帮助。

如前所述,请考虑在要删除的节点上运行身份转换和空模板的XSLT。 for环路, if逻辑,或使用所需的这种解决方案的数据结构(例如,数组列表,包含HashMap)的。

作为信息, XSLT是一种专用语言(XPath的同级语言),旨在将xml文件转换为其他xml,html甚至文本文件(csv / txt)。 诸如Java,PHP,Python等通用语言维护着运行XSLT 1.0脚本的库,甚至可以调用外部专用XSLT处理器(如libxslt / Saxon)。 此外,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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM