2017-06-29 144 views
0

如何从java中的XML文档中删除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价格标签,并产生以如下方式的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服务获取这些信息而改变,这可以改变它发送的信息。

+1

写自己的解析器,为此目的将需要大约最多10分钟 –

+0

您想使用哪种模式? DOM,OM,JAXB还是自定义分析器? –

+1

我不建议为XML编写自己的解析器,因为它比你想象的更复杂。但是,如果您真的处理严格限制的XML配置文件,那么这样做可能有意义。我自己,我倾向于用XSLT转换做这种工作。 Java支持XSLT,所需的转换将非常简单。 –

回答

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; 

} 

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

我希望这将有助于。

0

如上所述,请考虑运行Identity Transform的XSLT以及要删除的节点上的空模板。否for循环,if逻辑,或使用此解决方案所需的数据结构(例如,数组列表,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> 

的Java

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); 
    } 
} 
相关问题