2016-03-31 16 views
1

Şu anda DOM ayrıştırıcısını kullanarak JAVA'da bir XML belgesi oluşturmaya çalışıyorum. Başka bir soruda yayınlanan başka bir cevap kullanıyorum ve bana çok yardımcı oldu, ancak cevabım bana sahip olduğum birkaç vakayla birlikte bana yardımcı olacak kadar ayrıntıya girmiyor. Ben bugüne kadar benim XML dosyası ilan edilmiştir nasıl beni göstererek başlayalım:XML dosyası oluşturma ile ilgili sorular

package creatingXML; 

import java.io.File; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 

import org.w3c.dom.Document; 
import org.w3c.dom.Element; 

public class CreateXML 

{ 

    public static void main(String args[]){ 

     try{ 

      DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 
      Document doc = docBuilder.newDocument(); 

      Element rootElement = doc.createElement("Document"); 
      doc.appendChild(rootElement); 

      Element BkToCstmrDbtCdtNtfctn = doc.createElement("BkToCstmrDbtCdNtfctn"); 
      rootElement.appendChild(BkToCstmrDbtCdtNtfctn); 

      Element GrpHdr = doc.createElement("GrpHdr"); 
      BkToCstmrDbtCdtNtfctn.appendChild(GrpHdr); 

      Element MsgId = doc.createElement("MsgId"); 
      GrpHdr.appendChild(MsgId); 
      MsgId.appendChild(doc.createTextNode("0000000")); //MSG ID WILL GO HERE 

      Element CreDtTm = doc.createElement("CreDtTm"); 
      GrpHdr.appendChild(CreDtTm); 
      CreDtTm.appendChild(doc.createTextNode("2016-03-31T02:51:44"));  //CREDIT DATE TIME WILL GO HERE 

      //MsgRcpt Tree 
      Element MsgRcpt = doc.createElement("MsgRcpt"); 
      GrpHdr.appendChild(MsgRcpt); 
      Element Id = doc.createElement("Id"); 
      MsgRcpt.appendChild(Id); 
      Element OrgId = doc.createElement("OrgId"); 
      Id.appendChild(OrgId); 
      Element Othr = doc.createElement("Othr"); 
      OrgId.appendChild(Othr); 
      Element Id2 = doc.createElement("Id"); 
      Othr.appendChild(Id2); 
      Id2.appendChild(doc.createTextNode("CS"));  //Org ID will go here! 


      Element Ntfctn = doc.createElement("Ntfctn"); 
      BkToCstmrDbtCdtNtfctn.appendChild(Ntfctn); 

      Element Id3 = doc.createElement("Id"); 
      Ntfctn.appendChild(Id3); 
      Id3.appendChild(doc.createTextNode("163V2514435W14QI")); //Transaction ID will go here! 

      Element CreDtTm2 = doc.createElement("CreDtTm"); 
      Ntfctn.appendChild(CreDtTm2); 
      CreDtTm2.appendChild(doc.createTextNode("2016-03-31T02:51:44")); //Transaction credit date time will go here! 

      //Acct tree 
      Element Acct = doc.createElement("Acct"); 
      Ntfctn.appendChild(Acct); 
      Element Id4 = doc.createElement("Id"); 
      Acct.appendChild(Id4); 
      Element Othr2 = doc.createElement("Othr"); 
      Id4.appendChild(Othr2); 
      Element Id5 = doc.createElement("Id5"); 
      Othr2.appendChild(Id5); 
      Id5.appendChild(doc.createTextNode("41215212776"));  //Acct ID will go here! 

      //TxsSummry tree 
      Element TxsSummry = doc.createElement("TxsSummry"); 
      Ntfctn.appendChild(TxsSummry); 
      Element TtlDbtNtries = doc.createElement("TtlDbtNtries"); 
      TxsSummry.appendChild(TtlDbtNtries); 
      Element NbOfNtries = doc.createElement("NbOfNtries"); 
      TtlDbtNtries.appendChild(NbOfNtries); 
      NbOfNtries.appendChild(doc.createTextNode("1")); //Number of entires will go here! 
      Element Sum = doc.createElement("Sum"); 
      TtlDbtNtries.appendChild(Sum); 
      Sum.appendChild(doc.createTextNode("97.99"));  //Total sum will go here! 


      //Possible loop will go here 
      Element Ntry = doc.createElement("Ntry"); 
      Ntfctn.appendChild(Ntry); 

      Element NtryRef = doc.createElement("NtryRef"); 
      Ntry.appendChild(NtryRef); 
      NtryRef.appendChild(doc.createTextNode("163V24924AFW1LJ4")); //Ntry Reference ID 

      Element AmtCcy = doc.createElement("Amt Ccy"); 
      NtryRef.appendChild(AmtCcy); 






      TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
      Transformer transformer = transformerFactory.newTransformer(); 
      DOMSource source = new DOMSource(doc); 
      StreamResult result = new StreamResult(new File("C:\\Users\\jhamric\\Desktop\\testing.xml")); 
      transformer.transform(source, result); 


     }catch (ParserConfigurationException pce){ 
      pce.printStackTrace(); 
     }catch (TransformerException tfe){ 
      tfe.printStackTrace(); 
     } 

    } 

} 

O kod çok iyi bir oyun biliyorum ama şimdiye kadar ben mümkün olmuştur anlayabileceği ne yayınlayarak düşünmüş yapmak. Öğeleri oluşturma, alt öğeleri atama ve bu öğelere bir metin değeri atama konusunda sorun yaşıyorum. Şu an sahip olduğum problem, yaratmam gereken iki farklı unsuru içeriyor.

ilk kök öğedir, böyle bir ad alanı kullanmak gerekir:

+<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.04"> 

bunun yerine şu anda sahip olduğu sadece sahip.

Burada gibi bazı cevaplar ancak gerçekten benim koduyla yürütmek anlayamıyorum bir XPath kullanılarak açıklamak

Issues with xpath that contained namespaces in Java (Dom parser)

buldunuz.

Ben ikinci sorun saha şu şekildedir:

<Amt Ccy="USD">94134.86</Amt> 

etiketin = "USD" ve aynı zamanda bir metin düğümü atanır görünür Gördüğünüz gibi.

Bu

Element AmtCcy = doc.createElement("Amt_Ccy='USD'"); 

yapıyor çalıştı ama aşağıdaki hatayı alıyorum ..

Exception in thread "main" org.w3c.dom.DOMException: INVALID_CHARACTER_ERR: An invalid or illegal XML character is specified. 
    at com.sun.org.apache.xerces.internal.dom.CoreDocumentImpl.createElement(Unknown Source) 
    at creatingXML.CreateXML.main(CreateXML.java:103) 
Picked up JAVA_TOOL_OPTIONS: -agentlib:jvmhook 
Picked up _JAVA_OPTIONS: -Xrunjvmhook -Xbootclasspath/a:"C:\Program Files (x86)\HP\Unified Functional Testing\bin\java_shared\classes";"C:\Program Files (x86)\HP\Unified Functional Testing\bin\java_shared\classes\jasmine.jar" 

bu iki konularla herhangi bir yardım takdir gerçekten olacaktır.

+0

ne hakkında 'rootElement' setAttribute özellikler eklenirken ("xmlns", "urn: iso: std: iso: 20022: teknoloji: xsd: camt.054.001.04") ; ? – Tokazio

cevap

3

ait createElementNS yöntemi kullanmalısınız: <Amt Ccy="USD">94134.86</Amt>

Element rootElement doc.createElementNS("urn:iso:std:iso:20022:tech:xsd:camt.054.001.04", 
     "Document"); 

İkinci değeri USD içeren bir özellik Ccy sahip bir eleman Amt olduğunu ve 94134.86'un bir metin içeriği. nitelik yazma oluşturmak için:

Element AmtCcy = doc.createElement("Amty"); 
AmtCcy.setAttribute("Ccy", "USD"); 
NtryRef.appendChild(AmtCcy); 
+0

Teşekkürler - Bu harika bir cevap. Bana, eleman, öznitelik, değer ve metin bağlamı arasındaki farkı mükemmel tarif ettiniz. Bu gerçekten bana bir ton yardımcı olur! Ayrıca kök öğesi için harika bir cevap. Hala XPath'i kullanmam gerektiğini düşünüyordum, ama gerekli olmadığını gösterdiğiniz gibi. – jesric1029

1

İkinci sorununuz için başarısız oluyor, çünkü createElement sadece bir etiket adını parametre olarak alıyor. İfadeleri oraya koyamazsınız çünkü yapacağınız tek şey bu adı taşıyan bir etiket oluşturmaya çalışmaktır. Ne yapmaya çalıştığınız şeyi% 100 emin değilim ama Ccy eğer yanı Unsuru bir ayrıntının Eğer ad ayarlamak için setAttribute kullanabilirsiniz bu

Element AmtCcy = doc.createElement("Amt"); 
AmtCcy.setAttribute("Ccy","USD"); 

yapabilirsiniz böyledir varsayıyorum yapmayı istedi.

rootElement.setAttribute("xmlns", "urn:iso:std:iso:20022:tech:xsd:camt.054.001.04") 

ancak Sen createElementNs kullanarak bir isim alanlı eleman oluşturmak belgenin

+0

Cevabınız için teşekkürler. Diğerini aldım çünkü biraz daha ayrıntıya girmişti ama aynı zamanda gerçekten iyi bir cevabın vardı ve ben de bunu kabul edeceğim. – jesric1029