2011-05-30 29 views
0

在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> 

我发现谷歌的东西,但它并没有匹配我的需求。而且,因为我是新的Java,我不知道如何适应我的需求。

谢谢你的帮助。

+3

那么您的需求以及您发现的教程与您的需求不符? – jasso 2011-05-30 14:47:31

+0

[读取excel,写入XML]可能的重复(http://stackoverflow.com/questions/6174454/read-excel-write-to-xml) – CloudyMarble 2011-05-30 14:49:02

+1

@jasso ...我thik,我的需要是获得源生成xml文件的代码,我在上面提到过:)...因为我正在为它工作,像6天...我从来没有与Java工作,我不知道为什么我的老板让我这样做...和这只是我的问题的一小部分 – skaryu 2011-05-31 07:59:12

回答

0

我是这样解决的。这是难看的代码,但它为我工作,也许有造成复制了一些错误并粘贴

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(""); 
    } 
} 
1

前段时间我有一个类似的问题,我使用的网站给了我很好的理解不同的编码方式。

This website为您提供许多不同的方式来编码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; 
+0

谢谢......但我已经看到了那个页面......还有更多......但我仍然不明白如何编写创建此xml文件的脚本 – skaryu 2011-05-30 15:13:22

+0

你在说话把它写到一个文件?假设你已经有了XML并且你想写入文件? – RMT 2011-05-30 15:16:28

+0

我需要创建文件,然后写在那里 – skaryu 2011-05-30 15:24:44

2

我建议你使用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) 
+0

它看起来不错...但JAVA真的不是我的语言......你能请更具体的代码...我会真正感谢您的帮助...我很久没有在这...感谢 – skaryu 2011-05-30 15:30:09

+0

@skaryu - 由于您有一个XML模式,您可能会发现最容易生成您的JAXB模型从一个模式,并使用它来做你的编组/解组。以下是如何执行此操作的示例:http://bdoughan.blogspot.com/2010/09/processing-atom-feeds-with-jaxb.html – 2011-05-30 17:09:52

1

我对XStream有很好的体验。您只需制作对象并使用您想要的任何数据填充它们,最后您只需xstream.toXML(object);即可获取xml的字符串。

+0

如果该网站已关闭,就像我似乎正在经历的那样,你可能已经从[Wikipedia](http://en.wikipedia.org/wiki/XStream)学到了一些东西。+1添加XStream到我的'图书馆'。维姆 – Wivani 2011-05-30 15:28:29

0

看起来您的XML基于XML Schema(../xsd/nikuxog_customObjectInstance.xsd)。如果是这种情况,您可以使用XML Beans。鉴于XML Schema,XML Beans将生成一组Java类(或一个jar文件),您可以使用它们以编程方式创建您的XML。

优点是您的XML符合您的XML架构。我发现这种方法在过去很有用,并且我对XML Beans有很好的经验。

0

您可以在GitHub上使用可用的Scilca XML进展包。

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");