繁体   English   中英

使用dom4j为xml文件中的元素添加多个名称空间

[英]adding mutiple namespace for a element in xml file using dom4j

需要生成的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”添加两个名称空间时,出现错误消息:

线程“主” 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上遇到的第一个问题。 我希望我能得到一个答案:-)

DOM4J通常提供太多的方法来为猫皮。 在此区域中,由于Document#addElement(String, String)Element#addElement(String, String)进行的验证大不相同,因此增加了混乱:在第一种情况下,您可以添加具有限定名称的元素而不必将前缀绑定到一个名称空间,并且该元素最终没有名称空间(这是一个错误)。 在第二种情况下,您必须绑定前缀(正确)。

总之,如果可以避免的话,我建议不要使用限定的元素和属性名称( prefix:local-name )。 相反,请严格分隔元素或属性的本地名称,并使用正确声明的NamespaceQName构造。 在您的情况下:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM