Java DOM возиться с моими заголовками XML и добавлять атрибуты самостоятельно - PullRequest
1 голос
/ 07 апреля 2011

У меня проблема с небольшой программой, которую я написал.Он делает то, что я намеревался сделать (добавить / удалить / изменить атрибуты) очень хорошо - я очень рад этой части.Но когда я вывожу файл, мои заголовки меняются, и к некоторым элементам автоматически добавляются атрибуты.

Вот с чего я начну:

<!DOCTYPE TEI SYSTEM "teilite-ur.dtd">
<TEI xmlns="http://www.tei-c.org/ns/1.0">
    <teiHeader>
        <fileDesc>
...
<availability>
...

После преобразования каждого узла элемента в дополнительныйатрибут (имя = тест, значение = рабочий), вот что я получаю в итоге:

<TEI xmlns="http://www.tei-c.org/ns/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" test="working">
    <teiHeader test="working" type="text">
        <fileDesc test="working">
...
<availability default="false" status="unknown" test="working">
...

Итак, краткий обзор:

  • ! DOCTYPE строка была удалена
  • xmlns: xsi ... был добавлен
  • type = "text", default = "false", status = "unknown" anchored = "true" атрибуты добавляются автоматически (могут быть и другие, но этиэто те, которые показались мне).

Я читал здесь [/1707582/udalit-obyavlenie-xml-iz-sgenerirovannogo-dokumenta-xml-s-ispolzovaniem-java], как предотвратить добавление декларации XML в начало.Но я не уверен, как отключить остальные дополнения.

Спасибо!

Вот некоторый автономный код, который выполняет в основном то, что я хочу (немного больше настроек вреальная программа, но это не должно относиться к делу) и соответствующее руководство IBM , которое я использовал для его создания:

package xml_attrib_test;

import java.io.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import javax.xml.xpath.*;
import org.w3c.dom.*;

public class Main {

    public static void main(String[] args) {
        //Input
        File whichFile = new File("C:\\Users\\mw2xx\\Desktop\\proceedings.vol1.xml");

        DocumentBuilderFactory domFactory;
        DocumentBuilder builder;
        Document doc;
        XPathFactory factory;
        XPath xpath;
        XPathExpression expr;
        NodeList nodes;

        try {
            domFactory = DocumentBuilderFactory.newInstance();
            domFactory.setSchema(null);
            domFactory.setValidating(false);
            domFactory.setNamespaceAware(true);
            domFactory.setExpandEntityReferences(false);
            builder = domFactory.newDocumentBuilder();
            doc = builder.parse(whichFile);

            factory = XPathFactory.newInstance();
            xpath = factory.newXPath();
            expr = xpath.compile("//*");

            Object result = expr.evaluate(doc, XPathConstants.NODESET);
            nodes = (NodeList) result;
        } catch (Exception ex) {
            System.out.println("Error in parser.");
            return;
        }

        // Do Stuff With the XML Doc

        String attributeTag = "test";
        String attrValue = "working";

        for (int j = 0; j < nodes.getLength(); j++) {
            Node n = nodes.item(j);

            if (n.getNodeType() == Node.ELEMENT_NODE) {
                Element e = (Element) n;
                e.setAttribute(attributeTag, attrValue);
            } else if (n.getNodeType() == Node.ATTRIBUTE_NODE) {
                Attr a = (Attr) n;
                if (a.getName().equals(attributeTag)) {
                    a.setValue(attrValue);
                }
            }
        }

        // Output
        TransformerFactory tFactory;
        Transformer transformer;
        DOMSource source;
        File resultFile;
        StreamResult result;

        try {
            tFactory = TransformerFactory.newInstance();
            transformer = tFactory.newTransformer();
            transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");

            source = new DOMSource(doc);
            resultFile = new File("$$$$$.tmp");
            result = new StreamResult(resultFile);
            transformer.transform(source, result);
        } catch (Exception ex) {
            System.out.println("Error in transformer.");
            return;
        }

        whichFile.delete();
        resultFile.renameTo(whichFile);

        System.out.println("Success!");
    }
}

Ответы [ 2 ]

1 голос
/ 15 апреля 2011

После нескольких дней поиска и переполнения стека поиска я обнаружил аналогичный вопрос, который предоставил нужную настройку.

domFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

Java изменить и переместить нестандартный XML-файл

0 голосов
/ 07 апреля 2011

Используете ли вы стандартный анализатор DOM JDK?

Если да, то я предполагаю, что вы используете схему для проверки, и эта схема задает значения атрибута по умолчанию.Это объясняет:

  • Удаление DOCTYPE, потому что он не используется с проверкой схемы.Вы можете попробовать вызвать setValidating(true), но тогда вам, вероятно, потребуется добавить EntityResolver
  • Установка значений по умолчанию, как описано в XSD, и вставка атрибутов, поддерживающих проверку схемы.

Ответ, если все, что вас волнует, это обновление XML, это избегание схемы.Или один раз проанализируйте схему для проверки, затем еще раз для обновления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...