需要生成的XML文件:
<?xml version="1.0" encoding="UTF-8" ?>
<wrapper:MMSRMessage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wrapper="urn:iso:std:iso:20022:tech:xsd:head.003.001.01" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:head.003.001.01 MMSR_head.003.001.01_Wrapper.xsd">
<header:AppHdr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:header="urn:iso:std:iso:20022:tech:xsd:head.001.001.01">
<header:Fr>
...
</header:Fr>
</header:AppHdr>
</wrapper:MMSRMessage>
为根元素“wrapper:MMSRMessage”添加了两个名称空间,没有问题。 以下是它的Java代码:
Document document = DocumentHelper.createDocument();
Element wrapper = document.addElement("wrapper:MMSRMessage");
wrapper.addNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance")
.addNamespace("wrapper", "urn:iso:std:iso:20022:tech:xsd:head.003.001.01")
.addAttribute("xsi:schemaLocation", "urn:iso:std:iso:20022:tech:xsd:head.003.001.01 MMSR_head.003.001.01_Wrapper.xsd");
但是,当我为元素“header:AppHdr”添加两个名称空间时,我收到错误消息:
线程“main”中的异常org.dom4j.IllegalAddException:没有这样的名称空间前缀
使用java代码:
Element headerApp = wrapper.addElement("header:AppHdr");
headerApp.addNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance")
.addNamespace("header", "urn:iso:std:iso:20022:tech:xsd:head.001.001.01");
我也试过了:
Element headerApp = wrapper.addElement("header:AppHdr","urn:iso:std:iso:20022:tech:xsd:head.001.001.01")
.addNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
以这种方式不会发生错误,但无法为元素“header:AppHdr”添加名称空间“xmlns:xsi =”http://www.w3.org/2001/XMLSchema-instance“。
这是我在Stackoverflow的第一个问题。我希望我能得到一个答案: - )
答案 0 :(得分:0)
DOM4J通常提供太多方法来给猫皮肤涂抹。在此区域中,由于Document#addElement(String, String)
和Element#addElement(String, String)
执行非常不同的验证,因此增加了混淆:在第一种情况下,您可以添加具有限定名称的元素,而不必将前缀绑定到命名空间,并且元素结束没有命名空间(这是一个错误)。在第二种情况下,您必须具有绑定前缀(正确)。
总而言之,我建议使用合格的元素和属性名称(prefix:local-name
) not ,如果可以避免的话。相反,严格区分元素或属性的本地名称,并使用正确声明的Namespace
和QName
构造。在你的情况下:
Document document = DocumentHelper.createDocument();
Namespace xsi = Namespace.get("xsi", "http://www.w3.org/2001/XMLSchema-instance");
Namespace wrapper = Namespace.get("wrapper", "urn:iso:std:iso:20022:tech:xsd:head.003.001.01");
Namespace header = Namespace.get("header", "urn:iso:std:iso:20022:tech:xsd:head.001.001.01");
Element wrapperElement = document
.addElement(new QName("MMSRMessage", wrapper))
.addAttribute(new QName("schemaLocation", xsi), "urn:iso:std:iso:20022:tech:xsd:head.003.001.01 MMSR_head.003.001.01_Wrapper.xsd");
Element headerApp = wrapperElement.addElement(new QName("AppHdr", header));
headerApp.addElement(new QName("Fr", header));