Java 关于创建XML文件的问题
我目前正在尝试使用DOM解析器在JAVA中创建一个XML文档。我正在使用另一个问题中发布的另一个答案,这对我有很大帮助,但这个答案并没有深入到足够的细节来帮助我处理我遇到的几个案例。首先,让我展示到目前为止我是如何声明XML文件的:Java 关于创建XML文件的问题,java,xml,dom,xpath,Java,Xml,Dom,Xpath,我目前正在尝试使用DOM解析器在JAVA中创建一个XML文档。我正在使用另一个问题中发布的另一个答案,这对我有很大帮助,但这个答案并没有深入到足够的细节来帮助我处理我遇到的几个案例。首先,让我展示到目前为止我是如何声明XML文件的: package creatingXML; import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory
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();
}
}
}
我知道这是一个很好的代码,但我认为通过发布我到目前为止所拥有的,你可以理解我所能做的。我在创建元素、分配子元素和为这些元素分配文本值方面没有问题。我现在遇到的问题涉及我需要创建的两个不同元素
第一个是根元素,我需要使用如下名称空间:
+<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.04">
但是我得到了以下错误
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"
我非常感谢您在这两个问题上给予我的帮助 对于第二个问题,它失败了,因为createElement只是将标记名作为参数,您不能将表达式放在其中,因为它所做的只是尝试创建一个具有该名称的标记。我不是100%确定你想做什么,但我假设Ccy是元素的一个属性,所以你可以这样做
Element AmtCcy = doc.createElement("Amt");
AmtCcy.setAttribute("Ccy","USD");
如果需要,也可以使用setAttribute设置名称空间
rootElement.setAttribute("xmlns", "urn:iso:std:iso:20022:tech:xsd:camt.054.001.04")
但是您应该使用文档的createElements方法,因为createElement只是将标记名作为参数,所以无法将表达式放在其中,因为它所做的只是尝试创建一个具有该名称的标记。我不是100%确定你想做什么,但我假设Ccy是元素的一个属性,所以你可以这样做
Element AmtCcy = doc.createElement("Amt");
AmtCcy.setAttribute("Ccy","USD");
如果需要,也可以使用setAttribute设置名称空间
rootElement.setAttribute("xmlns", "urn:iso:std:iso:20022:tech:xsd:camt.054.001.04")
但是您应该使用文档的createElements方法您可以使用
createElements
创建一个带名称空间的元素:
Element rootElement doc.createElementNS("urn:iso:std:iso:20022:tech:xsd:camt.054.001.04",
"Document");
第二个94134.86
是一个元素Amt
,具有属性Ccy
,值USD
,文本上下文为94134.86
。
要创建属性write,请执行以下操作:
Element AmtCcy = doc.createElement("Amty");
AmtCcy.setAttribute("Ccy", "USD");
NtryRef.appendChild(AmtCcy);
您可以使用
createElements
创建一个命名空间元素:
Element rootElement doc.createElementNS("urn:iso:std:iso:20022:tech:xsd:camt.054.001.04",
"Document");
第二个94134.86
是一个元素Amt
,具有属性Ccy
,值USD
,文本上下文为94134.86
。
要创建属性write,请执行以下操作:
Element AmtCcy = doc.createElement("Amty");
AmtCcy.setAttribute("Ccy", "USD");
NtryRef.appendChild(AmtCcy);
如何向“rootElement”setAttribute(“xmlns”、“urn:iso:std:iso:20022:tech:xsd:camt.054.001.04”)添加属性?如何向“rootElement”setAttribute(“xmlns”、“urn:iso:std:iso:20022:tech:xsd:camt.054.001.04”)添加属性?谢谢-这是一个极好的回答。您完美地向我描述了元素、属性、值和文本上下文之间的区别。这真的帮了我大忙!对于根元素也是一个很好的答案。我仍然认为我需要使用XPath,但正如您所展示的,它是不需要的。谢谢-这是一个极好的答案。您完美地向我描述了元素、属性、值和文本上下文之间的区别。这真的帮了我大忙!对于根元素也是一个很好的答案。我仍然认为我需要使用XPath,但正如您所展示的,它是不需要的。谢谢您的回答。我选择了另一个,因为他说得更详细了一点,但你也有一个非常好的答案,我会投赞成票。谢谢你的回答。我选择了另一个,因为他说得更详细一点,但你也有一个非常好的答案,我会投赞成票。