[英]Xml parsing using xmlstream Reader and writing into a new xml file
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<aop:aspectj-autoproxy />
<bean id="A" class="A" scope="singleton">
<constructor-arg index='0'><ref bean='B'/></constructor-arg>
</bean>
<bean id="B" class="B" scope="singleton">
<aop:scoped-proxy proxy-target-class="true"/>
<constructor-arg index="0"><ref bean="B" /></constructor-arg>
</bean>
<bean id="C" class="C" scope="singleton">
<aop:scoped-proxy proxy-target-class="true"/>
<constructor-arg index="0"><ref bean="C" /></constructor-arg>
</bean>
</beans>
我有一个与此类似的XML。 我试图解析此xml并查找是否有一个名为scoped-proxy的元素,如果要删除整个bean标签。 我想为所有实例做。
例如 :
对于bean id:“ B”,它具有这个元素,所以我想删除整个
<bean id="B" class="B" scope="singleton">
<aop:scoped-proxy proxy-target-class="true"/>
<constructor-arg index="0"><ref bean="B" /></constructor-arg>
</bean>
并删除后,我想写一个新的xml文件。
样例代码:
import java.util.HashSet;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamReader;
import javax.xml.transform.stream.StreamSource;
import org.w3c.dom.Node;
public class XMLParser {
public static void main(String[] args) throws Exception {
XMLInputFactory xif = XMLInputFactory.newFactory();
StreamSource xml = new StreamSource("src/a.xml");
XMLStreamReader xsr = xif.createXMLStreamReader(xml);
HashSet<String> idSet = new HashSet<>();
while(xsr.hasNext()) {
if(xsr.isStartElement() && "bean".equals(xsr.getLocalName())) {
String value=xsr.getAttributeValue(1);
xsr.nextTag();
if("scoped-proxy".equals(xsr.getLocalName())){
idSet.add(value);
System.out.println(value);
}
}
xsr.next();
}
}
}
由于我不熟悉使用Java解析xml,请让我知道如何在找到时删除完整元素并将其写入新文件
一个相当简单的解决方案是将整个源文档读入内存,然后手动操作DOM:
public class DomFilter {
public static void main(String[] args) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder parser = factory.newDocumentBuilder();
try (InputStream in = new FileInputStream("src/a.xml")) {
// Parse the source
Document doc = parser.parse(in);
// Find all "bean" elements
NodeList beans = doc.getElementsByTagNameNS("http://www.springframework.org/schema/beans", "bean");
List<Element> toRemove = new ArrayList<>();
for (int i = 0; i < beans.getLength(); i++) {
Element bean = (Element) beans.item(i);
// Does the bean element have a "scoped-proxy" child element?
if (bean.getElementsByTagNameNS("http://www.springframework.org/schema/aop", "scoped-proxy").getLength() > 0) {
// Yes... add it to the remove list
toRemove.add(bean);
}
}
// Remove the elements we found
toRemove.forEach(e -> e.getParentNode().removeChild(e));
// Write the tree out using an identity transformer
Transformer writer = TransformerFactory.newInstance().newTransformer();
writer.transform(new DOMSource(doc), new StreamResult(System.out));
}
}
}
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class DomFilter {
public static void main(String[] args) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder parser = factory.newDocumentBuilder();
try (InputStream in = new FileInputStream("src/a.xml"))
{
// Parse the source
Document doc = parser.parse(in);
String filepath = "src/filtered.xml";
StreamResult result = new StreamResult(new File(filepath));
// Find all "bean" elements
NodeList beans = doc.getElementsByTagNameNS("http://www.springframework.org/schema/beans", "bean");
List<Element> toRemove = new ArrayList<>();
for (int i = 0; i < beans.getLength(); i++) {
Element bean = (Element) beans.item(i);
// Does the bean element have a "scoped-proxy" child element?
if (bean.getElementsByTagNameNS("http://www.springframework.org/schema/aop", "scoped-proxy").getLength() > 0) {
// Yes... add it to the remove list
toRemove.add(bean);
}
}
// Remove the elements we found
toRemove.forEach(e -> e.getParentNode().removeChild(e));
// Write the tree out using an identity transformer
Transformer writer = TransformerFactory.newInstance().newTransformer();
writer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
//writer.setOutputProperty(OutputKeys.INDENT, "yes");
writer.transform(new DOMSource(doc), result);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.