Создать XML-документ, используя nodeList
Мне нужно создать объект XML-документ, используя NodeList. Может кто-нибудь, пожалуйста, помогите мне сделать это. Я показал вам код и XML ниже
import
javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.*; import
org.w3c.dom.*;
public class ReadFile {
public static void main(String[] args) {
String exp = "/configs/markets";
String path = "testConfig.xml";
try {
Document xmlDocument = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(path);
XPath xPath = XPathFactory.newInstance().newXPath();
XPathExpression xPathExpression = xPath.compile(exp);
NodeList nodes = (NodeList)
xPathExpression.evaluate(xmlDocument,
XPathConstants.NODESET);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
XML-файл показан ниже
<configs>
<markets>
<market>
<name>Real</name>
</market>
<market>
<name>play</name>
</market>
</markets>
</configs>
Заранее спасибо..
2 ответа
Вы должны сделать это так:
- вы создаете новый
org.w3c.dom.Document newXmlDoc
где вы храните узлы в вашемNodeList
, - вы создаете новый корневой элемент и добавляете его к
newXmlDoc
- затем для каждого узла
n
в вашемNodeList
Вы импортируетеn
вnewXmlDoc
, а затем вы добавляетеn
как ребенокroot
Вот код:
public static void main(String[] args) {
String exp = "/configs/markets/market";
String path = "src/a/testConfig.xml";
try {
Document xmlDocument = DocumentBuilderFactory.newInstance()
.newDocumentBuilder().parse(path);
XPath xPath = XPathFactory.newInstance().newXPath();
XPathExpression xPathExpression = xPath.compile(exp);
NodeList nodes = (NodeList) xPathExpression.
evaluate(xmlDocument, XPathConstants.NODESET);
Document newXmlDocument = DocumentBuilderFactory.newInstance()
.newDocumentBuilder().newDocument();
Element root = newXmlDocument.createElement("root");
newXmlDocument.appendChild(root);
for (int i = 0; i < nodes.getLength(); i++) {
Node node = nodes.item(i);
Node copyNode = newXmlDocument.importNode(node, true);
root.appendChild(copyNode);
}
printTree(newXmlDocument);
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void printXmlDocument(Document document) {
DOMImplementationLS domImplementationLS =
(DOMImplementationLS) document.getImplementation();
LSSerializer lsSerializer =
domImplementationLS.createLSSerializer();
String string = lsSerializer.writeToString(document);
System.out.println(string);
}
Выход:
<?xml version="1.0" encoding="UTF-16"?>
<root><market>
<name>Real</name>
</market><market>
<name>play</name>
</market></root>
Некоторые заметки:
- Я изменился
exp
в/configs/markets/market
потому что я подозреваю, что вы хотите скопироватьmarket
элементы, а не единичныеmarkets
элемент - для
printXmlDocument
Я использовал интересный код в этом ответе
Надеюсь, это поможет.
Если вы не хотите создавать новый корневой элемент, вы можете использовать исходное выражение XPath, которое возвращает NodeList
состоящий из одного узла (имейте в виду, что ваш XML должен иметь один корневой элемент), который вы можете напрямую добавить в новый документ XML.
Смотрите следующий код, где я прокомментировал строки из кода выше:
public static void main(String[] args) {
//String exp = "/configs/markets/market/";
String exp = "/configs/markets";
String path = "src/a/testConfig.xml";
try {
Document xmlDocument = DocumentBuilderFactory.newInstance()
.newDocumentBuilder().parse(path);
XPath xPath = XPathFactory.newInstance().newXPath();
XPathExpression xPathExpression = xPath.compile(exp);
NodeList nodes = (NodeList) xPathExpression.
evaluate(xmlDocument,XPathConstants.NODESET);
Document newXmlDocument = DocumentBuilderFactory.newInstance()
.newDocumentBuilder().newDocument();
//Element root = newXmlDocument.createElement("root");
//newXmlDocument.appendChild(root);
for (int i = 0; i < nodes.getLength(); i++) {
Node node = nodes.item(i);
Node copyNode = newXmlDocument.importNode(node, true);
newXmlDocument.appendChild(copyNode);
//root.appendChild(copyNode);
}
printXmlDocument(newXmlDocument);
} catch (Exception ex) {
ex.printStackTrace();
}
}
Это даст вам следующий вывод:
<?xml version="1.0" encoding="UTF-16"?>
<markets>
<market>
<name>Real</name>
</market>
<market>
<name>play</name>
</market>
</markets>
Вы можете попробовать adoptNode()
метод документа.
Может быть, вам нужно будет перебрать ваш NodeList
, Вы можете получить доступ к личности Nodes
с nodeList.item(i)
,
Если вы хотите обернуть результаты поиска в Element
, вы можете использовать createElement() из Document
а также appendChild()
на вновь созданном Element