我有一个包含如下数据的大文件
<releases>
<release>
......
<companies>
<company>
</company>
</companies>
</release>
<release>
......
</releases>
我想产生和输出文件相同的输入文件,但所有的公司元素和他们的子删除。我试着使用Stax,我认为它会遍历元素,然后如果我得到匹配,我就可以不写那个元素,section就会被删除。例如,如果我扔掉一个元素,它会导致其中的元素和被删除,但它似乎只是删除了元素本身,没有其他,对吗?
即<releases>
<release>
......
</release>
<release>
......
</releases>
这是我目前拥有的代码:
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
InputStream in = new FileInputStream(source);
XMLEventReader reader = inputFactory.createXMLEventReader(in);
OutputStream out = new FileOutputStream(target);
XMLEventWriter writer = outputFactory.createXMLEventWriter(out);
XMLEvent event;
while(reader.hasNext()){
event = reader.nextEvent();
writer.add(event);
if(event.getEventType() == XMLStreamConstants.START_ELEMENT)
{
if(event.asStartElement().getName().toString().equalsIgnoreCase("companies"))
{
System.out.println("Deleting:"+event);
continue;
}
else
{
writer.add(event);
}
}
else
{
writer.add(event);
}
}
我想我现在有了,Stax逐个元素处理元素,所以我需要标记何时找到开始元素,设置一个变量来指示所有后续数据应该被忽略,直到到达结束元素。
代码例子:
import javax.xml.stream.*;
import javax.xml.stream.events.XMLEvent;
import java.io.*;
public class FixDb
{
public static void main(String[] args) throws Exception
{
File source = new File(args[0]);
if(!source.exists())
{
System.out.println("File:"+source+ " does not exist");
}
File target = new File(source+".new");
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
InputStream in = new FileInputStream(source);
XMLEventReader reader = inputFactory.createXMLEventReader(in);
OutputStream out = new FileOutputStream(target);
XMLEventWriter writer = outputFactory.createXMLEventWriter(out);
XMLEvent event;
boolean deleteSection = false;
while(reader.hasNext())
{
event = reader.nextEvent();
if(event.getEventType() == XMLStreamConstants.START_ELEMENT && event.asStartElement().getName().toString().equalsIgnoreCase("companies"))
{
deleteSection=true;
continue;
}
else if(event.getEventType() == XMLStreamConstants.END_ELEMENT && (event.asEndElement().getName().toString().equalsIgnoreCase("companies")))
{
deleteSection=false;
continue;
}
else if(deleteSection)
{
continue;
}
else
{
writer.add(event);
}
}
}
}