Вы были на правильном пути с создания нового документа, разбор части и добавить тир узлы новыми.
Вы подходите неудачно, потому что пытаетесь добавить целый документ к другому, что невозможно.
Вы могли бы попробовать что-то вроде этого:
public org.w3c.dom.Document concatXmlDocuments(String rootElementName, InputStream... xmlInputStreams) throws ParserConfigurationException, SAXException, IOException {
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
org.w3c.dom.Document result = builder.newDocument();
org.w3c.dom.Element rootElement = result.createElement(rootElementName);
result.appendChild(rootElement);
for(InputStream is : xmlInputStreams) {
org.w3c.dom.Document document = builder.parse(is);
org.w3c.dom.Element root = document.getDocumentElement();
NodeList childNodes = root.getChildNodes();
for(int i = 0; i < childNodes.getLength(); i++) {
Node importNode = result.importNode(childNodes.item(i), true);
rootElement.appendChild(importNode);
}
}
return result;
}
Кода выше копий всех узлов, найденных в корневом элементе каждого документа. Конечно, вы можете выбрать выборочную копию только интересующих вас узлов. В результате документ отобразит все узлы обоих документов.
Тест
@Test
public void concatXmlDocuments() throws ParserConfigurationException, SAXException, IOException, TransformerException {
try (
InputStream doc1 = new ByteArrayInputStream((
"<headerTag>\r\n" +
" <tag1>doc1 value</tag1>\r\n" +
"</headerTag>").getBytes(StandardCharsets.UTF_8));
InputStream doc2 = new ByteArrayInputStream((
"<headerTag>\r\n" +
" <tag1>doc2 value</tag1>\r\n" +
"</headerTag>").getBytes(StandardCharsets.UTF_8));
ByteArrayOutputStream docR = new ByteArrayOutputStream();
) {
org.w3c.dom.Document result = concatXmlDocuments("headerTag", doc1, doc2);
TransformerFactory trf = TransformerFactory.newInstance();
Transformer tr = trf.newTransformer();
tr.setOutputProperty(OutputKeys.INDENT, "yes");
DOMSource source = new DOMSource(result);
StreamResult sr = new StreamResult(docR);
tr.transform(source, sr);
System.out.print(new String(docR.toByteArray(), StandardCharsets.UTF_8));
}
}
Выход
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<headerTag>
<tag1>doc1 value</tag1>
<tag1>doc2 value</tag1>
</headerTag>
EDIT
Я хотел бы создать, что "поддельные" родитель, конкатенации файлов, бушель т, то только восстановить список элементов headerTag
Как вы говорите, создать поддельный родителя.Вот как можно это сделать:
1) У конкатенацию
public org.w3c.dom.Document concatXmlDocuments(InputStream... xmlInputStreams) throws ParserConfigurationException, SAXException, IOException {
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
org.w3c.dom.Document result = builder.newDocument();
org.w3c.dom.Element rootElement = result.createElement("fake");
result.appendChild(rootElement);
for(InputStream is : xmlInputStreams) {
org.w3c.dom.Document document = builder.parse(is);
org.w3c.dom.Element subRoot = document.getDocumentElement();
Node importNode = result.importNode(subRoot, true);
rootElement.appendChild(importNode);
}
return result;
}
2) Восстановить список узлов для headerTag
public NodeList recoverTheListOfElementsHeaderTag(String xml) throws ParserConfigurationException, SAXException, IOException {
NodeList listOfElementsHeaderTag = null;
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
try (InputStream is = new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8))) {
listOfElementsHeaderTag = recoverTheListOfElementsHeaderTag(builder.parse(is));
}
return listOfElementsHeaderTag;
}
public NodeList recoverTheListOfElementsHeaderTag(org.w3c.dom.Document doc) {
org.w3c.dom.Element root = doc.getDocumentElement();
return root.getChildNodes();
}
Test
@Test
public void concatXmlDocuments() throws ParserConfigurationException, SAXException, IOException, TransformerException {
try (
InputStream doc1 = new ByteArrayInputStream((
"<headerTag>" +
"<tag1>doc1 value</tag1>" +
"</headerTag>").getBytes(StandardCharsets.UTF_8));
InputStream doc2 = new ByteArrayInputStream((
"<headerTag>" +
"<tag1>doc2 value</tag1>" +
"</headerTag>").getBytes(StandardCharsets.UTF_8));
) {
org.w3c.dom.Document result = concatXmlDocuments(doc1, doc2);
String resultXML = toXML(result);
System.out.printf("%s%n", resultXML);
NodeList listOfElementsHeaderTag = null;
System.out.printf("===================================================%n");
listOfElementsHeaderTag = recoverTheListOfElementsHeaderTag(resultXML);
printNodeList(listOfElementsHeaderTag);
System.out.printf("===================================================%n");
listOfElementsHeaderTag = recoverTheListOfElementsHeaderTag(result);
printNodeList(listOfElementsHeaderTag);
}
}
private String toXML(org.w3c.dom.Document result) throws TransformerFactoryConfigurationError, TransformerConfigurationException, TransformerException, IOException {
String resultXML = null;
try (ByteArrayOutputStream docR = new ByteArrayOutputStream()) {
TransformerFactory trf = TransformerFactory.newInstance();
Transformer tr = trf.newTransformer();
DOMSource source = new DOMSource(result);
StreamResult sr = new StreamResult(docR);
tr.transform(source, sr);
resultXML = new String(docR.toByteArray(), StandardCharsets.UTF_8);
}
return resultXML;
}
private void printNodeList(NodeList nodeList) {
for(int i = 0; i < nodeList.getLength(); i++) {
printNode(nodeList.item(i), "");
}
}
private void printNode(Node node, String startIndent) {
if(node != null) {
System.out.printf("%s%s%n", startIndent, node.toString());
NodeList childNodes = node.getChildNodes();
for(int i = 0; i < childNodes.getLength(); i++) {
printNode(childNodes.item(i), startIndent+ " ");
}
}
}
Выход
<?xml version="1.0" encoding="UTF-8" standalone="no"?><fake><headerTag><tag1>doc1 value</tag1></headerTag><headerTag><tag1>doc2 value</tag1></headerTag></fake>
===================================================
[headerTag: null]
[tag1: null]
[#text: doc1 value]
[headerTag: null]
[tag1: null]
[#text: doc2 value]
===================================================
[headerTag: null]
[tag1: null]
[#text: doc1 value]
[headerTag: null]
[tag1: null]
[#text: doc2 value]
является 'headerTag' ваш корневой элемент? если не то, что является корневым элементом? – A4L
вам нужен корневой элемент для создания надлежащего XML-документа. Если это не xml, укажите язык разметки, на котором он создается. кроме того, почему вы не конвертируете org.w3c.Document (s) в соответствующие файлы String и не объединяете их и, наконец, не делаете из него еще один экземпляр org.w3c.Document. –
@ A4L, «headerTag» является корневым элементом Документов, созданных методами «createDocument1» и «createDocument2», и единственное, что я хочу, это конкатенация один за другим, даже если мне нужно создать родитель root. – Manuelarte