[英]How do I remove elements and their children from Xml using Java and Stax
我有一個大文件,包含這樣的數據
<releases>
<release>
......
<companies>
<company>
</company>
</companies>
</release>
<release>
......
</releases>
我想產生和輸出文件的方式與輸入文件相同,但要刪除所有公司元素及其子元素。我正在嘗試使用Stax,我認為它會遍歷所有元素,然后如果匹配成功,我可以只是不寫那個元素,該部分將被刪除。 即,如果我丟棄了導致其中的元素並被刪除的元素,但似乎它只是刪除了元素本身而沒有其他任何東西,對嗎?
即
<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);
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.