2017-08-24 15 views
0

意見,我需要修改一個XML文件,但所有的意見在輸出修剪。我搜索並認爲我需要使用Transformer.setProperty()函數,但不知道如何使用它。任何幫助或暗示將非常感激。因爲我是一個XML新手,請在XML術語上簡單介紹一下。的Java XML變壓器 - 保留在輸出

感謝,

下面,如果我想保留,從XML文件的開頭開始的部分:

<!DOCTYPE ProductDataeXchangePackage [ 
<!-- DTD for IPC-2571 
Public Identifier: "-//IPC//DTD 2571 200111//EN" 
Official Location: http://webstds.ipc.org/2571.dtd --> 

<!ELEMENT AdditionalAttribute EMPTY> 

<!ATTLIST AdditionalAttribute name  CDATA #REQUIRED 
          value  CDATA #REQUIRED 
          dimension CDATA #IMPLIED 
          dataType  (String | 
              Boolean | 
              Float | 
              Double | 
              Decimal | 
              DateTime | 
              Binary | 
              UriReference | 
              Other) #IMPLIED 
          dataTypeOther CDATA #IMPLIED 
          description CDATA #IMPLIED > 
<!ELEMENT AdditionalAttributes (AdditionalAttribute+)> 
]> 

<?pdx_version 1.0?> 
<?generated_by Oracle/Extract/9.3.4/63?> 
..... 

這裏是我的代碼,它重新寫入到另一個文件:

TransformerFactory transfac = TransformerFactory.newInstance(); 
Transformer trans = null; 
try { 
    trans = transfac.newTransformer(); 
    -->trans.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, "??")<-- ; 
} catch (TransformerConfigurationException e1) { 
    // TODO Auto-generated catch block 
    e1.printStackTrace(); 
} 
StringWriter sw = new StringWriter(); 
StreamResult result = new StreamResult(sw); 

DOMSource source = new DOMSource(doc); 
try { 
    trans.transform(source, result); 
} catch (TransformerException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
String xmlString = sw.toString(); 
OutputStream f0; 
byte buf[] = xmlString.getBytes(); 
f0 = new FileOutputStream("pdx1.xml"); 
for(int n=0;n<buf.length;n++) { 
    f0.write(buf[n]); 
} 
f0.close(); 
buf = null; 

回答

1

DTD不是XSLT/XPath數據模型的一部分,所以它不會被XSLT轉換保留。有一些解決方法,但它們依賴於某些工具或擴展。當您使用Java和僅使用默認變壓器連載一些DOM樹你可能首先要檢查LSSerializerhttps://docs.oracle.com/javase/8/docs/api/org/w3c/dom/ls/LSSerializer.html)是否是不是做一個更好的工作比默認Transformer輸出DTD和/或CDATA部分節點。

+0

感謝Martin提供的信息。我會看看LSSerializer,但同時爲了符合截止日期,我想我會以舊式的方式來做 - 使用文件操作將DTD部分注入輸出文件。 – user1941319