JDOM中没有DOCTYPE声明错误

时间:2013-05-23 19:00:23

标签: java jdom jdom-2

我的代码在

下面
Document convertDataToXML(ArrayList<MyData> oMyDataCollection) {
    try {

            //get the Input template file location          
            String sExportXMLTemplate = "";
            XPathFactory xpfacFile = XPathFactory.instance();
            XPathExpression<Element> xElementsLoc = xpfacFile.compile(IssueExchangerXPathConstants.EXPORT_XML_TEMPLATE, Filters.element());
            List<Element> elementsLoc = xElementsLoc.evaluate(xConfigurationDocument);          
            for (Element xElem : elementsLoc) {     
                logger.trace(xElem.getText());
                logger.trace("getXSLTFileName ends");
                sExportXMLTemplate =xElem.getText();
                break;
            }           
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder;
            dBuilder = dbFactory.newDocumentBuilder();
            org.w3c.dom.Document doc = dBuilder.parse(new File("C://Folder/Template.xml"));
            DOMBuilder domBuilder = new DOMBuilder();
            //Document xIssuesMappingXMLInternal=null;
            Document xIssuesMappingXMLInternal;
            xIssuesMappingXMLInternal = domBuilder.build(doc);              
            XPathFactory xpfac = XPathFactory.instance();       
            XPathExpression<Element> xElements = xpfac.compile(ExportXMLConstants.ISSUES_EXPORT,Filters.element(),null);
            List<Element> elements = xElements.evaluate(xIssuesMappingXMLInternal);
            for (Element xIssuesParent : elements) {
              System.out.println(xIssuesParent.getName());
              Element xCloneIssue = null ; 
              int iCounter=1;
              for (Element xIssueChild : xIssuesParent.getChildren())
              {
                  xCloneIssue = xIssueChild.clone();
                  xCloneIssue.detach();
                  xIssueChild.detach(); //remove from parent
                  break; //expecting only one node here..
              }
            //LOOP THE COLLECTION                
             Element xClonedCopy = xCloneIssue.clone();
             for (RTCData oMyDataCollection : oMyDataCollectionCollection) {                 
                 xCloneIssue.getAttribute(ExportXMLConstants.ISSUE_ID_ATTR_EXPORT).setValue("ISSUE-"+iCounter);
                //fill other nodes
                 Element xNewID = xCloneIssue.getChild(ExportXMLConstants.ISSUE_NEW_ID_EXPORT);
                 xNewID.setText(oMyDataCollection.getsExchangePartnerID());                  
                 Element xID = xCloneIssue.getChild(ExportXMLConstants.ISSUE_ID_EXPORT);
                 xID.setText(oMyDataCollection.getsID_Issue());                  
                 Element xSummary = xCloneIssue.getChild(ExportXMLConstants.ISSUE_SUMMARY_EXPORT);
                 xSummary.setText(oMyDataCollection.getsSummary_ExchangeInfo());                     
                 Element xStatus = xCloneIssue.getChild(ExportXMLConstants.ISSUE_STAUTS_EXPORT);
                 xStatus.setText(oMyDataCollection.getsStatus_Issue());                  
                 Element xComments = xCloneIssue.getChild(ExportXMLConstants.ISSUE_COMMENTS_EXPORT);
                 if (xComments != null)
                 {
                     Element xComment = xComments.getChild(ExportXMLConstants.ISSUE_COMMENT_EXPORT);                         
                     xComment.setText(oMyDataCollection.getsFeedback());
                 }
                 xIssuesParent.addContent(xCloneIssue);
                 xCloneIssue=xClonedCopy.clone();
                 iCounter++;
              }
            }
            XMLOutputter xmlOutput = new XMLOutputter();                 
            // display nice nice
            xmlOutput.setFormat(Format.getPrettyFormat());
            xmlOutput.output(xIssuesMappingXMLInternal, new FileWriter("c:\\temp\\OutputFile.xml"));
            //logger.info(xmlOutput.outputString(xIssuesMappingXMLInternal));
            //logger.info(xIssuesMappingXMLInternal.toString());
            return xIssuesMappingXMLInternal;
    } catch (Exception e) {
        logger.fatal(e);
    }
    return null;
}

此函数的目的是将数据从对象转换为XML并返回XML Document。要验证此“文档”,我将生成的XML保存到文件c:\temp\OutputFile.xml&amp;我得到了我需要的XML

但是当我尝试返回xIssuesMappingXMLInternal的文档时,我总是得到以下Document: No DOCTYPE declaration, Root is element <ISSUES/>

为什么这是c

XML如下所示

<ISSUES>
   <ISSUE ID="123">
      <NEWID>123</NEWID>
      <ID>233</ID>
      <SUMMARY>THIS IS A TEST</SUMMARY>
      <STATUS>NEW</STATUS>
      <COMMENTS>
        <COMMENT>
            PLAIN TEXT DATA HERE
        </COMMENT>
      </COMMENTS>
   </ISSUE>
   <ISSUE>
        .....
  </ISSUE>
</ISSUES>

这里我将有多个节点

我的期望是Document将返回整个ISSUES节点。

此外,我不想在这里使用任何“doctype”。这是一个简单的XML

我正在使用Java SE 1.6和JDOM 2.0.4

任何帮助都会非常感激

非常感谢

1 个答案:

答案 0 :(得分:2)

不确定为什么会遇到DOCTYPE问题。我稍后会尝试重现它。在此期间,当您更改行时,它可能会消失:

        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder;
        dBuilder = dbFactory.newDocumentBuilder();
        org.w3c.dom.Document doc = dBuilder.parse(
               new File("C://Folder/Template.xml"));
        DOMBuilder domBuilder = new DOMBuilder();
        //Document xIssuesMappingXMLInternal=null;
        Document xIssuesMappingXMLInternal;
        xIssuesMappingXMLInternal = domBuilder.build(doc);              

        SAXBuilder saxBuilder = new SAXBuilder();
        Document xIssuesMappingXMLInternal = saxBuilder.build(
               new File("C://Folder/Template.xml"));              

使用JDOM时无需使用DOM中间文档

编辑:(根据上述评论) 真正的问题不是问题,而是“正常工作”。你所看到的是toString() method call on Document的结果:你只是没有复制/粘贴[]括号,这会使那些更明显,我不会感到困惑。

一切正常,如果你想将XML文档的输出作为String值(而不仅仅是Document的toString()值),那么使用XMLOutputter.outputString(doc)

相关问题