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

没有前缀的多命名空间XML文档

暴阳州
2023-03-14

我有一个有趣的情况,我的XML编辑器(Oxygen,使用Xerces XML处理器)需要根标签上的前缀,但是我的JAXB XML Marshaller(也是基于Xerces的)不需要根标签上的前缀。我正在试图理解这种情况。

首先是2个模式文件:

ns1.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.ns1.com"
    xmlns="http://www.ns1.com"
    xmlns:ns2="http://www.ns2.com"
    elementFormDefault="unqualified"
    attributeFormDefault="unqualified"
    version="1.0" >
    <xs:import namespace="http://www.ns2.com" schemaLocation="ns2.xsd"/>
    <xs:element name="root"> 
        <xs:complexType>
            <xs:all>
                <xs:element name="element1">
                    <xs:complexType>
                        <xs:all> 
                            <xs:element name="element1a" type="NS1Type"/>
                            <xs:element name="element1b" type="ns2:NS2Type"/>
                        </xs:all>
                    </xs:complexType>
                </xs:element>
            </xs:all>
        </xs:complexType>
    </xs:element>
    <xs:simpleType name="NS1Type">
        <xs:restriction base="xs:string">
            <xs:enumeration value="VALUE_1"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

ns2。xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.ns2.com"
    xmlns="http://www.ns2.com"
    elementFormDefault="unqualified"
    attributeFormDefault="unqualified"
    version="1.0" >

    <xs:complexType name="NS2Type">
        <xs:all>
            <xs:element name="value" type="xs:float" minOccurs="0"/>
        </xs:all>
    </xs:complexType>
</xs:schema>

目前的氧气释放(16.1)需要我称之为“版本1”的东西

版本1

<?xml version="1.0" encoding="UTF-8"?>
<ns1:root 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:ns1="http://www.ns1.com"
 xsi:schemaLocation="http://www.ns1.com ../schema/ns1.xsd">
    <element1>
        <element1a>VALUE_1</element1a>
        <element1b>
            <value>4.5</value>
        </element1b>
    </element1>
</ns1:root>

如果我像下面的示例(版本1)那样删除前缀:

版本2

<?xml version="1.0" encoding="UTF-8"?>
<root 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:ns1="http://www.ns1.com"
 xsi:schemaLocation="http://www.ns1.com ../schema/ns1.xsd">
    <element1>
        <element1a>VALUE_1</element1a>
        <element1b>
            <value>4.5</value>
        </element1b>
    </element1>
</root>

氧气抱怨:

"[Xerces]

另一方面,JAXB只支持版本2之外的版本。如果提供版本1,则会出现以下错误:

javax。xml。绑定UnmarshaleException:意外元素(uri:)http://www.ns1.com,local:“root”)。预期的元素为

完整的堆栈跟踪是:

at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:662)
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:258)
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:253)
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:120)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1063)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:498)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:480)
    at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:150)
    at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
    at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
    at org.apache.xerces.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)

现在,JAXB封送器和解封器代码是:

    JAXBContext context = JAXBContext.newInstance(object.getClass());
    javax.xml.bind.Marshaller marshaller = context.createMarshaller();


    JAXBContext jaxbContext = JAXBContext.newInstance(clazz);
    Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

虽然我很快就会允许Swagger Core进行编组和解编,而Swagger使用Jackson XML。

我需要弄清楚如何以我的编辑器和JAXB解组器都接受的方式构造这个XML(或配置JAXB)

共有1个答案

董哲
2023-03-14

问题不在于前缀,而在于名称空间。

您的模式有目标命名空间,但也有elementFormDefault="un合格"(您确定要这样吗?)。这意味着全局元素是合格的,但本地元素不是。

所以你的root元素是合格的,属于命名空间http://www.ns1.com。所以Xerces错误消息是正确的。

另一个问题是,为什么JAXB不识别名称空间。A你没有发布Java代码(请发布)我有两个理论:

  • 您已经手动定义了JAXB注释,但没有正确定义名称空间
  • 您已经使用XJC或其他基于XJC的工具生成了代码,但不知怎的错过了包信息。java,它通常定义前缀

顺便说一句,我不会把任何JAXB实现称为“基于Xerces的”。

 类似资料:
  • 我正在尝试使用 JAXB 创建站点地图索引文件。按照创建站点地图的要求,我必须在根元素中添加命名空间属性: 我想有一个简单的方法来解决这个问题。因为这似乎是一个标准过程,所以我不想做复杂的解决方法,也不想在我的项目中添加更多的依赖项来解决这个问题 当前输出如下: 我的< code>SitemapIndex模型如下: 我还尝试手动添加名称空间字段,它可以生成文件,但是当我尝试读取文件时会出现异常。

  • 我正在从jaxb模型生成rest响应(使用Jersey)。对于某些响应,生成的XML将名称空间前缀(ns2)添加到名称空间属性中,尽管它们都存在于同一个名称空间中。但对其他人来说,这完全没问题。 根据我的分析,我认为当一个复杂元素(另一个jaxb模型)在其中使用时会发生这种情况。但所有这些模型都在package-info.java中的相同名称空间中声明。 这是代码。 XYZModel.class

  • 主要内容:命名冲突,使用前缀来避免命名冲突,XML 命名空间 - xmlns 属性,统一资源标识符(URI,全称 Uniform Resource Identifier),默认的命名空间,实际使用中的命名空间XML 命名空间提供避免元素命名冲突的方法。 命名冲突 在 XML 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。 这个 XML 携带 HTML 表格的信息: <table> <tr> <td>Apples</td> <td>Bananas</td> <

  • 我想使用JAXB来 将xml解组为java对象, 将其封送回xml 并使用名称空间生成完全相同的输出 下面是原始的 XML: 我正在使用以下POJO: 我用于取消/编组的代码: 这实际上不起作用,我甚至无法解组初始xml。但是如果我尝试封送一个POJO,我只在代码中设置字段。我得到以下结果: 我如何摆脱这个ns3前缀?

  • 问题内容: 在使用RDFLib 3.0的Python脚本中,序列化三元组时获得以下XML输出: 如何为RDFLib(或分别为XML-Serializer)自动分配的匿名_x前缀定义特定的名称空间前缀? 预先非常感谢您的回复! 问题答案: 我最终通过查看一些(相当分散的)rdflib doc文件找到了解决方案。对于存储三元组的(合并)图,调用 即 将“ False”作为第三个参数传递会覆盖现有的名称

  • 在调用axis2 1.7.5(Wsdl2Java)生成的存根时,有人知道如何解决以下问题吗? 我发现存根发送了以下请求,但没有添加/定义SOAP版本(xmlns:soapenv=”http://schemas.xmlsoap.org/soap/envelope/)这是问题的根源 因此,我尝试如下设置SoapVersionURL 甚至可以直接将存根中的名称空间设置为 但是,这两种方法仍然忽略“xml