Ссылка XML и XSD с использованием java - PullRequest
0 голосов
/ 30 мая 2020

Я пытаюсь написать заголовок для файла xml, чтобы он выглядел примерно так:

<file xmlns="http://my_namespace"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://my_namespace file.xsd">

однако я не могу найти, как это сделать с помощью документа класс в java. Вот что у меня есть:

public void exportToXML() {
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder;

        try {

            dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.newDocument();
            doc.setXmlStandalone(true);
            doc.createTextNode("<file xmlns=\"http://my_namespace"\n" +
                    "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
                    "xsi:schemaLocation=\"http://my_namespace file.xsd\">");
            Element mainRootElement = doc.createElement("MainRootElement");
            doc.appendChild(mainRootElement);

            for(int i = 0; i < tipoDadosParaExportar.length; i++) {
                mainRootElement.appendChild(criarFilhos(doc, tipoDadosParaExportar[i]));
            }
            Transformer tr = TransformerFactory.newInstance().newTransformer();
            tr.transform(new DOMSource(doc),
                    new StreamResult(new FileOutputStream(filename)));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Я попытался записать его в файл с помощью createTextNode, но это тоже не сработало, он только записывает версию перед отображением элементов.

PrintStartXMLFile

Был бы признателен, если бы вы могли мне помочь. Хорошего дня

1 Ответ

0 голосов
/ 30 мая 2020

Ваш метод createTextNode() подходит только для создания текстовых узлов, он не подходит для создания элементов. Для этого вам нужно использовать createElement (). Если вы делаете это путем построения дерева, тогда вам необходимо создавать узлы, вы не можете писать лексическую разметку.

Я не уверен, что MainRootElement должно быть; вы предоставили только фрагмент желаемого результата, поэтому трудно сказать.

Создание дерева DOM с последующей его сериализацией - довольно трудоемкий способ создания файла XML. Проще использовать что-то вроде XMLEventWriter. Но, честно говоря, меня разочаровали все существующие подходы и я написал новую библиотеку для этой цели как часть Saxon 10. Она называется просто «Pu sh» и выглядит примерно так:

Processor proc = new Processor();
Serializer serializer = proc.newSerializer(new File(fileName));
Push push = proc.newPush(serializer);
Document doc = push.document(true);
doc.setDefaultNamespace("http://my_namespace");
Element root = doc.element("root")
  .attribute(new QName("xsi", "http://www.w3.org/2001/XMLSchema-instance", "schemaLocation"), 
             "http://my_namespace file.xsd");
doc.close();
...