2016-03-31 4 views
1

現在、DOMパーサーを使用してJavaでXML文書を作成しようとしています。私は別の質問に投稿された別の答えを使用していますが、それは私が持っている事例のカップルで私を助けるために十分な詳細に入っていないが、私には多くの助けとなりました。私はこれまでの私のXMLファイルを宣言されているかを示すことから始めましょう:XMLファイルの作成に関する質問

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

    } 

} 

私は、コードの良いビットです知っているが、私は私がこれまであなたは、私ができているのか理解できてきたものを掲示することにより、考えする。私は要素の作成、子要素の割り当て、テキスト値の割り当てに問題はありません。私が今問題を抱えているのは、私が作成する必要のある2つの要素が関係していることです。代わりに、ちょうど私が現在持っているように持つの

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

は、最初はルート要素である、私はこのような名前空間を使用する必要があります。

私は、しかし、私は本当に私のコードでそれを実行する方法を理解することはできませんXPathを使用して説明し、ここで

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

のようないくつかの答えを見つけました。

私が持っている第二の問題は、このようなフィールドです:あなたは=「USD」タグとは、テキストノードを割り当てられていることが表示されます見ることができるように

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

私は本当にこれらの2つの問題を持つ任意の助けをいただければ幸いです。..

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" 

を私はこの

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

をやってみましたが、私は次のエラーを取得します。

+0

何についてのあなたの 'rootElement' setAttributeメソッドに属性を追加する( "のxmlns"、 "URN:ISO:STD:ISO:20022:ハイテク:のxsd:camt.054.001.04") ; ? – Tokazio

答えて

3

のはcreateElementNSメソッドを使用する必要があります<Amt Ccy="USD">94134.86</Amt>

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

第二には、値USDと属性Ccyを有する素子Amtですテキストコンテキストは94134.86です。 は、属性の書き込みを作成するには:

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

ありがとう - それは素晴らしい答えです。あなたは、要素、属性、値とテキストの文脈の違いを私に完全に説明しました。それは本当に私にトンを助けます! また、ルート要素のための素晴らしい答え。私はまだXPathを使う必要があると思っていましたが、あなたが示したようにそれは必要ありません。 – jesric1029

1

createElementはパラメータとしてタグ名を取るだけなので、2番目の問題は失敗します。その中に式を入れることはできません。言い換えればその名前でタグを作成しようとするからです。私はあなたが何をしようとして100%わからないが、あなたはあなた場合は、同様にあなたの名前空間を設定するsetAttributeメソッドを使用することができ、この

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

を行うことができますので、私はCCYが要素の属性であると仮定していますしたかった。

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

しかし、あなたはあなたがcreateElementNsを使用して名前空間の要素を作成し、文書

+0

答えをありがとう。彼はもう少し詳細に入ったので私は他の人を選んだが、あなたも本当に良い答えを持っていたので、私はupvoteします。 – jesric1029

関連する問題