基于StAX而不是DOM的简单实现。但是,如果需要的话,可以很容易地将其转换为DOM(不过需要使用递归)。
import java.io.IOException;
import java.io.StringReader;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.XMLEvent;
public class FlattenXmlExample
{
private static XMLInputFactory inFactory = XMLInputFactory.newInstance();
public static void main(String[] args) throws XMLStreamException, IOException
{
String xmlRecord =
"<emplist>\n" +
"<emp>\n" +
" <manager>\n" +
" <id>1</id>\n" +
" <name>foo</name>\n" +
" </manager>\n" +
"</emp>\n" +
"<emp>\n" +
" <clerk>\n" +
" <cid>1</cid>\n" +
" <cname>foo</cname>\n" +
" </clerk>\n" +
"</emp>\n" +
" </emplist>";
String flatXmlRecord = flattenXmlRecord(xmlRecord);
System.out.print(flatXmlRecord);
}
private static String flattenXmlRecord(final String xmlRecord) throws XMLStreamException
{
StringBuilder flatXmlRecord = new StringBuilder();
XMLEventReader eventReader = inFactory.createXMLEventReader(new StringReader(xmlRecord));
while (eventReader.hasNext())
{
XMLEvent event = eventReader.nextEvent();
if (event.getEventType() == XMLEvent.START_ELEMENT )
{
String elementName = event.asStartElement().getName().getLocalPart();
event = eventReader.nextEvent();
if(event.getEventType() == XMLEvent.CHARACTERS)
{
if(!event.asCharacters().getData().trim().isEmpty())
{
flatXmlRecord.append(elementName + ", " + event.asCharacters().getData() + "\n");
}
}
}
}
return flatXmlRecord.toString();
}
}
输入:
<emplist>
<emp>
<manager>
<id>1</id>
<name>foo</name>
</manager>
</emp>
<emp>
<clerk>
<cid>1</cid>
<cname>foo</cname>
</clerk>
</emp>
</emplist>
输出:
id, 1
name, foo
cid, 1
cname, foo