如何解决java:写入xml文件
| 在Java中,我需要创建如下所示的xml文件:<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<NikuDataBus xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"../xsd/nikuxog_customObjectInstance.xsd\">
<Header action=\"write\" externalSource=\"NIKU\" objectType=\"customObjectInstance\" version=\"8.1.0.4247\"/>
<customObjectInstances objectCode=\"hen_allockey_p\">
<instance instanceCode=\"MIG5033028\" objectCode=\"hen_allockey_p\"
parentInstanceCode=\"001260\" parentObjectCode=\"project\">
<CustomInformation>
<ColumnValue name=\"hen_from\">200801</ColumnValue>
<ColumnValue name=\"name\">MIG5033028</ColumnValue>
<ColumnValue name=\"code\">MIG5033028</ColumnValue>
<OBSAssocs/>
<Security/>
</instance>
</customObjectInstances>
</NikuDataBus>
我在Google上找到了一些东西,但与我的需求不符。而且,由于我是java的新手,所以我不知道如何使它适应我的需求。
谢谢您的帮助。
解决方法
我建议您改用JAXB。创建类NikuDataBus,Header,CustomInformation等。将它们标记为@XmlEntity。创建并填充对象。
NikyDataBus dataBus = new NikuDataBus();
dataBus.setHeader(....)
//etc,etc....
File f = new File(\"mydata.xml\");
Marshaller m = JAXBContext.newInstance(NikuDataBus.class,Header.class,CustomInformation.class ).createMarshaller().marshal(dataBus,f)
, 我在XStream方面有很好的经验。您只需要创建对象并使用所需的任何数据填充它们,最后只需2英镑即可获得xml的字符串。
, 不久前我遇到了类似的问题,我使用的网站使我对不同的编码方式有了很好的了解。
该网站为您提供了多种不同的xml编码方式:字符串,DOM,SAX
TransformerFactory transfac = TransformerFactory.newInstance();
Transformer trans = transfac.newTransformer();
//create string from xml tree
StringWriter sw = new StringWriter();
StreamResult result = new StreamResult(sw);
DOMSource source = new DOMSource(doc);
trans.transform(source,result);
String xmlString = sw.toString();
//Writing the string to a file
OutputStream outputStream;
byte buf[] = xmlString.getBytes();
outputStream = new FileOutputStream(file);
for (byte element : buf) {
outputStream.write(element);
}
outputStream.close();
buf = null;
, 看起来您的XML基于XML模式(../xsd/nikuxog_customObjectInstance.xsd
)。如果是这种情况,则可以使用XML Bean。给定XML Schema,XML Beans将产生一组Java类(或jar文件),您可以使用它们以编程方式创建XML。
好处是您的XML符合XML架构。过去,我发现这种方法很有用,并且我在XML Beans方面有丰富的经验。
, 我这样解决了。这是不好看的代码,但对我有用,也许是由于复制和粘贴引起的一些错误
public class POIExcelReader {
private void setHenAllocKeyHeader(StringBuilder sb) {
sb.append (\"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\r\\n\"
+ \"<NikuDataBus xmlns:xsi=\\\"http://www.w3.org/2001/XMLSchema-instance\\\" xsi:noNamespaceSchemaLocation=\\\"../xsd/nikuxog_customObjectInstance.xsd\\\">\\r\\n\"
+ \"<Header action=\\\"write\\\" externalSource=\\\"NIKU\\\"objectType=\\\"customObjectInstance\\\" version=\\\"8.1.0.4247\\\"/>\\r\\n\"
+ \"<customObjectInstances objectCode=\\\"hen_allockey_p\\\">\\r\\n\"
+ \"<instance instanceCode=\\\"MIG5033028\\\" objectCode=\\\"hen_allockey_p\\\" parentInstanceCode=\\\"001260\\\" parentObjectCode=\\\"project\\\">\\r\\n\");
}
private void setHenAllocKeyBottom (StringBuilder sb) {
sb.append (\"<OBSAssocs/>\\r\\n\"
+\"<Security/>\\r\\n\"
+\"</customObjectInstances>\\r\\n\"
+ \"</NikuDataBus>\\r\\n\");
}
protected void jobRun() throws Exception {
StringBuilder sb = new StringBuilder();
setHenAllocKeyHeader(sb);
String prolog = sb.toString();
sb = new StringBuilder();
setHenAllocKeyBottom(sb);
String epilog = sb.toString();
FileOutputStream fos = new FileOutputStream(\"c:\\\\test\\\\osem.xml\");
OutputStreamWriter osw = new OutputStreamWriter(fos,Charset.forName(\"UTF-8\"));
osw.write(prolog);
osw.write(epilog);
osw.flush();
osw.close();
}
public static void main(String[] args){
try{
job.jobRun();
} catch (Exception e)
{
System.out.println(\"\");
}
}
, 您可以使用GitHub上提供的Scilca XML Progression软件包。
Node rootNode = Node.constructNode(<NikuDataBusxmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"../xsd/nikuxog_customObjectInstance.xsd\">\");
rootNode.addChildNode(Node.constructNode(\"<Header action=\"write\" externalSource=\"NIKU\" objectType=\"customObjectInstance\" version=\"8.1.0.4247\"/>\"));
String customObj = \"<customObjectInstances objectCode=\"hen_allockey_p\">\"
+ \"<instance instanceCode=\"MIG5033028\" objectCode=\"hen_allockey_p\" parentInstanceCode=\"001260\" parentObjectCode=\"project\">\"
+ \"<CustomInformation>\"
+ \"<ColumnValue name=\"hen_from\">200801</ColumnValue>\"
+ \"<ColumnValue name=\"name\">MIG5033028</ColumnValue>\"
+ \"<ColumnValue name=\"code\">MIG5033028</ColumnValue>\"
+ \"</CustomInformation>\"
+ \"<OBSAssocs/><Security/>\"
+ \"</instance>\"
+ \"</customObjectInstances>\"
// Now build to customObject element using a VirtualXML Iterator
XMLIterator xi = new VirtualXML.XMLIterator(customObj);
Node customO = Node.readFromFile(xi);
rootNode.addChildNode(customO);
Document XmlDocument = new Document(rootNode);
XmlDocument.addXmlDeclaration(1.0,\"UTF-8\",null);
XMLWriter xw = XmlDocument.getWriter();
xw.write(\"D:/file.txt\");
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。