2014-12-04 6 views
0

Так что я делаю очистку данных в серии XML-документов, используя StAX. Я хочу по существу прочитать в документе и выплюнуть тот же самый документ с отсутствием нескольких тегов. Проблема, с которой я сталкиваюсь, заключается в том, что я не выдаю допустимый XML.Используйте StAX для чтения DTD из одного документа 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, то как, черт возьми, я получу эту вещь.

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

ответ

0

1) Является ли мой вывод недействительным, поскольку ему не хватает DTD?

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

В XML-спецификации, срок действия является defined таким образом:

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

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

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

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

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

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

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

Если вы получаете сообщение о «exta content», кажется вероятным, что ваш результат не только недействителен, но и не является корректным. Сначала проверьте и исправьте.

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