Вы правы, со стандартным XML API, нет хорошего пути - вот один пример (может быть с ошибками; он работает, но я написал это давно).
import javax.xml.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import org.w3c.dom.*;
import java.io.*;
public class Proc
{
public static void main(String[] args) throws Exception
{
//Parse the input document
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("in.xml"));
//Set up the transformer to write the output string
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
transformer.setOutputProperty("indent", "yes");
StringWriter sw = new StringWriter();
StreamResult result = new StreamResult(sw);
//Find the first child node - this could be done with xpath as well
NodeList nl = doc.getDocumentElement().getChildNodes();
DOMSource source = null;
for(int x = 0;x < nl.getLength();x++)
{
Node e = nl.item(x);
if(e instanceof Element)
{
source = new DOMSource(e);
break;
}
}
//Do the transformation and output
transformer.transform(source, result);
System.out.println(sw.toString());
}
}
Может показаться, что вы можете получить первого потомка, просто используя doc.getDocumentElement (). GetFirstChild (), но проблема в том, что если между корневым элементом и дочерним элементом есть пробел, это создаст текст узел в дереве, и вы получите этот узел вместо фактического элемента узла. Выход из этой программы:
D:\home\tmp\xml>java Proc
<?xml version="1.0" encoding="UTF-8"?>
<element1>
<child attr1="blah">
<child2>blahblah</child2>
</child>
</element1>
Я думаю, что вы можете подавить строку версии XML, если она вам не нужна, но я не уверен в этом. Вероятно, я бы попытался использовать стороннюю библиотеку XML, если это вообще возможно.