Создать XML-документ, используя nodeList - PullRequest
6 голосов
/ 26 апреля 2011

Мне нужно создать объект 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 ]

12 голосов
/ 26 апреля 2011

Вы должны сделать это так:

  • вы создаете новый 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>
0 голосов
/ 26 апреля 2011

Вы можете попробовать adoptNode() метод Документ .

Может быть, вам нужно будет повторить ваш NodeList.Вы можете получить доступ к индивидуальному Nodes с помощью nodeList.item(i).

. Если вы хотите обернуть результаты поиска в Element, вы можете использовать createElement () из Document и appendChild() нанедавно созданный Element

...