2014-12-04 84 views
0

因此,我正在使用StAX對一系列XML文檔進行一些數據清理。我想從本質上閱讀文檔,然後用幾個缺失的標籤吐出完全相同的文檔。我遇到的問題是我不輸出有效的XML。使用StAX從一個XML文檔讀取DTD並寫入另一個

您可以在左側看到我的輸出,並在右側看到原始文檔[here](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)if是如何包含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內容」的消息,您的輸出可能不僅無效,而且不完整。先檢查並修復。

「額外內容」錯誤消息的可能原因是您過早關閉了根元素,或者根本沒有根元素。

相關問題