我有一个有趣的情况,我的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)
问题不在于前缀,而在于名称空间。
您的模式有目标命名空间,但也有elementFormDefault="un合格"
(您确定要这样吗?)。这意味着全局元素是合格的,但本地元素不是。
所以你的root
元素是合格的,属于命名空间http://www.ns1.com
。所以Xerces错误消息是正确的。
另一个问题是,为什么JAXB不识别名称空间。A你没有发布Java代码(请发布)我有两个理论:
包信息。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