2013-05-09 124 views
0

我想用這種格式生成xml文件。使用java的Xml生成

<?xml version="1.0" encoding="UTF-8"?> 
    <Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.0" 
     folio="779" fecha="2011-12-05T18:24:42" 
     sello="..." 
     formaDePago="PAGO EN UNA SOLA EXHIBICION" noCertificado="00001000000102160027" condicionesDePago="EFECTOS FISCALES AL PAGO" 
     subTotal="5123.23" total="5942.95" Moneda="USD" tipoDeComprobante="ingreso" 
     xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv3.xsd"> 
     <Emisor rfc="TIA050408342" nombre="TECNOLOGIAS DE INFORMACION AMERICA S.A. DE C.V."> 
     <DomicilioFiscal calle="Montecito" noExterior="38" noInterior="P 32-5" colonia="Napoles" localidad="Distrito Federal" 
      municipio="Distrito Federal" estado="México" pais="Mex." codigoPostal="03810" /> 
     </Emisor> 
     <Addenda> 
     <ElementosClientesNormales xmlns:ext="http://www.buzone.com.mx/XSD/Sender19877/A" 
      xsi:schemaLocation="http://www.buzone.com.mx/XSD/Sender19877/A http://www.buzone.com.mx/XSD/Sender19877/A/Addenda.xsd"> 
      <Conector>TEX9302097F3</Conector> 
      <CadenaOriginal>...about 1000 characters...</CadenaOriginal> 
     </Addenda> 
    </Comprobante> 

因爲我們知道,我們的CA使用SAX解析器或JAXB或dom4j的

創建XML文件,但我仍不能產生標籤,如Comprobante:CFDI,並把它添加元素,如對開=「774」等等。

而且我們如何能夠創造這樣Emisor:cfdi rfc

標籤如何創建使用Java這樣的XML創建? 任何博客,教程,解釋如何創建這樣的XML文件。

感謝, 冉

+1

您不能使用SAX創建XML文件。使用本教程.http://www.mkyong.com/java/how-to-create-xml-file-in-java-dom/ – 2013-05-09 14:11:43

+0

爲什麼不能創建名稱空間標籤並向其添加屬性?不知道你失敗了,提供有意義的建議就更加困難。 – 2013-05-09 14:15:06

回答

1

您可以嘗試使用namspace創建元素和屬性。

這裏是一個示例代碼使用標準的Java XML API

@Test 
public void genXmlWithNamespace() throws ParserConfigurationException, TransformerFactoryConfigurationError, TransformerException { 

    String nsURI = "http://example.com/foo"; 

    DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
    Document doc = docBuilder.newDocument(); 
    doc.setXmlStandalone(true); 
    Element root = doc.createElementNS(nsURI, "foo:company"); 
    doc.appendChild(root); 

    root.setAttributeNS(nsURI, "foo:name", "example"); 

    Element e = null; 

    e = doc.createElementNS(nsURI, "foo:employee"); 
    e.setAttributeNS(nsURI, "foo:id", "1"); 
    e.setTextContent("John Doe"); 
    root.appendChild(e); 

    e = doc.createElementNS(nsURI, "foo:employee"); 
    e.setAttributeNS(nsURI, "foo:id", "2"); 
    e.setTextContent("John Smith"); 
    root.appendChild(e); 

    Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
    transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
    transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); 
    Result output = new StreamResult(System.out); 
    Source input = new DOMSource(doc); 
    transformer.transform(input, output); 
} 

輸出

<?xml version="1.0" encoding="UTF-8"?> 
<foo:company xmlns:foo="http://example.com/foo" foo:name="example"> 
    <foo:employee foo:id="1">John Doe</foo:employee> 
    <foo:employee foo:id="2">John Smith</foo:employee> 
</foo:company> 
1

從XML,我看到它是指XML架構文件http://www.sat.gob.mx/cfd/3http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv3.xsdhttp://www.buzone.com.mx/XSD/Sender19877/A/Addenda.xsd。下載這些模式並使用JAXB生成Java類。使用JAXB生成xml,這應該與預期的兼容。否則,它對xsd引用沒有意義。

如果您無法獲得這些xsd,那麼該選項將如下。 1.使用trang庫從上述xml生成xsd(http://www.dotkam.com/2008/05/28/generate-xsd-from-xml/)。 2.清理XSD。從trang生成的XSD可能並不總是正確的。 3.使用xjc從xsd生成JAXB類 4.如果需要關聯任何名稱空間,請修改JAXB類。

1
  1. 您必須下載從SAT頁面要XSD的版本( http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd
  2. 創建一個將創建java類的目錄。 (前測試。)
  3. 從JAVA JDK執行命令: XJC -d ./testing/ cfdv33.xsd
  4. 你會得到枚舉一些警告,但基本上你會得到Java類與JAXB批註。
  5. 測試創建一個「Comprobante」與以前
  6. 生成的Java類做元帥
ObjectFactory of = new ObjectFactory(); 
Comprobante comprobante = of.createComprobante(); 
comprobante.set... 
... 
DocumentBuilderFactory docBuilderFac = DocumentBuilderFactory.newInstance(); 
docBuilderFac.setNamespaceAware(true); 
DocumentBuilder db = docBuilderFac.newDocumentBuilder(); 
Document doc = db.newDocument(); 
marshaller.marshal(comprobante,doc); 
... 

我有一個project,你可以用這樣的引用,並可能提高它。