我的代码在
下面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
任何帮助都会非常感激
非常感谢
答案 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)