JAXB - XML输出中的命名空间处理

时间:2015-03-17 14:50:03

标签: java xml java-ee jaxb xml-namespaces

我正在尝试生成类似于我已有的XML文档。

所以我使用一些工具为xml生成了xsd(我记得使用Visual Studio编译器附带的那个),然后通过Eclipse生成jaxb类。现在我能够成功编组XML输出,与我引用的原始xml文档略有不同。一个区别是命名空间。 xml输出中不存在所有名称空间元素。

原始文档具有如下命名空间结构:

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<ClassPackage xmlns="http://www.example.com/in-CLASS/1.0" xmlns:name1="http://www.example.org/Schemas/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.com/in-CLASS/1.0 C:\schemas\in-class.xsd">

我在 marshalled output XML中有以下标题:

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<ClassPackage xmlns="http://www.example.com/in-CLASS/1.0">

我生成的 package-info.java 类如下:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.example.com/in-CLASS/1.0", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.test.xml;

请帮助我获取与原始文档类似的命名空间元素。

1 个答案:

答案 0 :(得分:0)

您可能缺少name1名称空间,因为它未在ClassPackage对象的任何子元素中使用。

如果其他对象都不属于这些名称空间,则不会打印它们。

您可以在XmlSchema注释中声明其他名称空间:

@javax.xml.bind.annotation.XmlSchema(
elementFormDefault=javax.xml.bind.annotation.XmlNsForm.QUALIFIED,
namespace = "http://www.example.com/in-CLASS/1.0", 
xmlns={@XmlNs(prefix="name1", namespaceURI="http://www.example.org/Schemas/XMLSchema"))

但是你应该检查你生成的xsd模式是否是名称空间的,因为它怀疑xml有额外的名称空间声明,但没有属于它的元素。由于xml模式通常是为命名空间定义的,因此您应该为name1模式添加额外的xsd文档,该文档在man xsd文档中导入。

如果没有看到整个xml文档,很难说命名空间是否为工件,或者它们是否应该被某些元素真正使用。