2014-12-04 5 views
0

그래서 StAX를 사용하는 일련의 XML 문서에서 일부 데이터 정리를 수행하고 있습니다. 필자는 본질적으로 문서를 읽고 몇 개의 태그가 누락 된 정확한 문서를 작성하려고합니다. 내가 가지고있는 문제는 유효한 XML을 출력하지 않는다는 것입니다.StAX를 사용하여 하나의 XML 문서에서 DTD를 읽고 다른 문서에 쓰기

내 출력은 왼쪽에 표시하고 원본 문서는 오른쪽 [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를 가리키는 런타임 매개 변수를 허용하지만 다른 매개 변수는 DTD를 가리 키지 않습니다.

1a) 예 예 DTD를 어떻게 포함합니까?아니 말해하더라도, 이것은 StAX를 참조 구현을위한 the JavaDocs에서 나에게

을 괴롭 히고있다, 그것은 당신의 친구가 있었다 writeDTD(string) 것처럼 보인다.

2) DTD가 아니라면 어떻게 이런 일을 유효하게 할 수 있습니까?

'임시 콘텐츠'에 대한 메시지가 표시되는 경우 출력물이 유효하지 않지만 올바른 형식이 아닐 수 있습니다. 먼저 확인하고 수정하십시오.

"추가 콘텐츠"오류 메시지의 원인은 루트 요소를 중간에 닫았거나 루트 요소가 전혀없는 것입니다.