Используйте StAX для чтения DTD из одного документа XML и записи в другой

Поэтому я делаю некоторую очистку данных в серии документов XML с использованием StAX. Я хочу по существу прочитать документ и выплюнуть тот же самый документ с несколькими отсутствующими тегами. У меня проблема в том, что я не выводил действительный XML.

Вы можете увидеть мой вывод слева и оригинальный документ справа [здесь] ( http://imgur.com/a/oFxZd). Изображение внизу также является выводом из xmllint -valid. Как видите, в нем говорится, что DTD не найден, и в конце документа есть дополнительный контент.

Мой код для реализации писателя это

public XMLEventWriter setUpWriter(File blah) throws FileNotFoundException,                XMLStreamException {
    newFileName = thef.getName().substring(0, thef.getName().indexOf("_") + 1);

    try {
        writer = outputFactory
                .createXMLEventWriter(new FileOutputStream(newFileName + "mush.xml"), "UTF-8");

    } catch (XMLStreamException ex) {
        ex.printStackTrace();
        System.out.println("There was an XML Stream Exception, whatever that means for writer");
    }
    //outputFactory.setProperty("escapeCharacters", false);
    eventFactory = XMLEventFactory.newInstance();
    StartDocument startDocument = eventFactory.createStartDocument();

    writer.add(startDocument);
    //writer.add("<!DOCTYPE DjVuXML>");
    return writer;
}

Это мой код, который обрабатывает фактическую запись.

 if (event.isStartElement()) { //first it looks for start elements
            StartElement se = event.asStartElement();
            if ("OBJECT".equals(se.getName().getLocalPart())) {
                writer.add(se);
            } else if ("MAP".equals(se.getName().getLocalPart())) {
                writer.add(se);
    } else if ("PARAM".equals(se.getName().getLocalPart())) {
                writer.add(se);
            } else if ("LINE".equals(se.getName().getLocalPart())) {
                writer.add(se);
            } else if ("DjVuXML".equals(se.getName().getLocalPart())) {
                writer.add(se);
            }else if ("WORD".equals(se.getName().getLocalPart())) {
                    word.text = reader.getElementText();

                    EndElement wordEnd = eventFactory.createEndElement("", "", "WORD");
                    writer.add(se);
                    Characters characters = eventFactory.createCharacters(word.text);
                    writer.add(characters);
                    writer.add(wordEnd);
                }

            }

        } else if (event.isEndElement()) {

            EndElement ee = event.asEndElement();
            if ("MAP".equals(ee.getName().getLocalPart())) {
                writer.add(ee);

            } else if ("DjVuXML".equals(ee.getName().getLocalPart())) {
                writer.add(ee);
            } else if ("LINE".equals(ee.getName().getLocalPart())) {
                writer.add(ee);
            }
            else if ("BODY".equals(ee.getName().getLocalPart())) {
                writer.add(ee);
            }
        }

    }
    writer.flush();
    writer.close();

Теперь, когда у нас это получилось, мой вопрос имеет два аспекта:

1) Не верен ли мой вывод, потому что в нем отсутствует DTD?

1a) если да, как включить DTD? Даже если Нет, скажи мне, это беспокоит меня

2) Если это не DTD, то как, черт возьми, я получаю эту вещь действительной.

Спасибо за вашу помощь!!

1 ответ

1) Не верен ли мой вывод, потому что в нем отсутствует DTD?

Короткий ответ: теоретически, может быть, да, а может и нет; на практике да.

В спецификации XML валидность определяется следующим образом:

Документ XML действителен, если у него есть связанное объявление типа документа и если документ соответствует выраженным в нем ограничениям.

Некоторые читатели считают, что документ действителен в отношении DTD тогда и только тогда, когда документ подчиняется ограничениям в DTD. В этом смысле документ без объявления типа документа может быть действительным в отношении некоторого указанного DTD, а документ с объявлением типа документа может быть действительным в отношении DTD, указанного в его объявлении типа документа, или в отношении любого другого указанного DTD. Или не действительный, в зависимости от обстоятельств.

Другие читатели считают, что это определение означает, что документ не может быть действительным (по крайней мере, в строгом смысле), если у него нет объявления типа документа, и что вопрос о действительности имеет смысл только в отношении определения типа документа, указанного в документе. декларация типа документа.

На практике, если вы не укажете проверяющему парсеру, где найти DTD для проверки, у парсера нет другого выбора, кроме как выбрать второе, более ограниченное представление. Как он может проверить документ, если не может найти DTD? (Некоторые проверяющие парсеры принимают параметры времени выполнения для указания на DTD, другие нет.)

1a) если да, как включить DTD? Даже если Нет, скажи мне, это беспокоит меня

Из JavaDocs для эталонной реализации StAX это выглядит так, как будто writeDTD(string) были твоим другом.

2) Если это не DTD, то как, черт возьми, я получаю эту вещь действительной.

Если вы получаете сообщение о "дополнительном контенте", то, скорее всего, ваш вывод не только неверный, но и неверно сформированный. Проверьте и исправьте это в первую очередь.

Вероятная причина появления сообщения об "дополнительном контенте" заключается в том, что вы либо преждевременно закрыли корневой элемент, либо у вас вообще нет корневого элемента.

Другие вопросы по тегам