当前位置: 首页 > 知识库问答 >
问题:

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

袁奇逸
2023-03-14

需要生成的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:没有这样的名称空间前缀

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

这是我在StackOverflow的第一个问题。我希望我能得到一个答案:-)

共有1个答案

梁丘远航
2023-03-14

DOM4J通常提供了太多剥猫皮的方法。在这个领域中,由于文档#addelement(String,String)element#addelement(String,String)执行非常不同的验证,所以会增加混淆:在第一种情况下,您可以添加一个具有限定名的元素,而没有绑定到名称空间的前缀,该元素最终没有名称空间(这是一个错误)。在第二种情况下,您必须有前缀绑定(正确)。

总而言之,如果可以避免的话,我建议不要使用限定的元素和属性名(前缀: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));
 类似资料:
  • 我想让JAXB列表到xml,其中命名空间只出现在根元素中,而不是在任何其他元素中: 我已经尝试了package level @XmlSchema,但是我一定是做错了什么,因为没有显示任何东西。 这是我的根元素类: 我还有以下包-info.java:

  • 我正在写一个实用程序之间的集成内部系统和第三方产品。我试图生成一个可以由第三方产品加载的xml文件,但我很难按照他们的要求生成xml。我已经创建了一个简化的版本,只是为了测试。 预期产出应如下: 我的代码如下: 主要: 课程类别:

  • 问题内容: 我认为对于真正了解JAXB绑定文件的人来说这很容易… 基本问题 如何配置JAXB将多个元素解组到同一类中? 注意:我想避免向我的项目中添加另一个依赖项(例如MOXy)。 理想情况下,这可以通过注释或自定义绑定文件来完成。 背景 我有一个XML文档,其中包含许多相同元素的变体,每个变体具有完全相同的属性。在下面的示例中,我只关心“雇员”,但是XML指定了“董事,经理和职员”。出于我们的目

  • 我认为这对真正理解JAXB绑定文件的人来说很容易... 如何配置JAXB将多个元素解组到同一个类中? 注意:我想避免在我的项目中添加另一个依赖项(比如MOXy)。理想情况下,这可以通过注释或自定义绑定文件来实现。 我有一个XML文档,其中包含许多相同元素的变体——每个元素都有完全相同的属性。使用下面的示例,我只关心“员工”,但XML指定了“董事、经理和员工”。为了我们的目的,这些都是同一个父类的子

  • 问题内容: 我需要为元素添加名称空间定义,因为使用apache xmlbean生成xml时不会添加元素。如何使用xmlbeans API做到这一点? 问题答案: 我已经找到问题的答案。就是这样。

  • 问题内容: 我有一个丑陋的XML,上面有很多名称空间,当我尝试通过simpleXML加载它(如果我指示第一个名称空间)时,我会得到一个xml对象,但是后面带有其他名称空间的标记不会使它成为该对象。 如何解析该XML? 我试图用下面的代码解析它 但是$ xml对象仅包含以下内容 问题答案: 我认为您需要注册名称空间并使用XPath进行访问。如下所示的内容应该可以帮助您(我没有设施可以对此进行测试)。