- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
问题
如何在使用 JAXB 编码时消除出现在所有元素和属性上的自动生成的命名空间前缀
我已经展示了编码后的当前 XML 输出和预期输出。
详情
我正在使用 JDK 1.6 更新 21 提供的默认 JaxB 实现 (Metro)。
我的 XSD 文件如下所示。我使用 xjc 为此 XSD 生成 Java 类,我不想添加/更改任何生成的 Java 类中的注释,以便我可以继续使用 xjc。
在代码中,这就是我编码的方式......我使用 ObjectFactory 等创建 MYJAVAOBJECTREE 的地方......
JAXBContext jcDXD = JAXBContext.newInstance(MDASJ.class);
QName qn=new QName(XMLDataFormat.XML_ROOT_NAME);
marshallerDXD = jcDXD.createMarshaller();
marshallerDXD.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshallerDXD.setProperty(Marshaller.JAXB_ENCODING, "ISO-8859-1");
marshallerDXD.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://www.theronyx.com/mdasj/xmldata mdasj-data.xsd");
jaxbElementDXD = new JAXBElement<MDASJ>(qn, MDASJ.class, MYJAVAOBJECTTREE);
marshallerDXD.marshal(jaxbElementDXD, System.out);
XSD 文件
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.theronyx.com/mdasj/xmldata" xmlns="http://www.theronyx.com/mdasj/xmldata">
<!-- definition of attributes -->
<xs:attribute name="ID" type="xs:string"/>
<xs:attribute name="ComputerTime" type="xs:string"/>
<xs:attribute name="VarId" type="xs:string"/>
<xs:attribute name="Value" type="xs:string"/>
<xs:attribute name="DataType" type="xs:string"/>
<!-- definition of complex elements -->
<!-- DIH -->
<xs:element name="DIH">
<xs:complexType>
<xs:attribute ref="ID" use="required"/>
</xs:complexType>
</xs:element>
<!-- TimeStamp -->
<xs:element name="TimeStamp">
<xs:complexType>
<xs:attribute ref="ComputerTime" use="required"/>
</xs:complexType>
</xs:element>
<!-- Variable -->
<xs:element name="Variable">
<xs:complexType>
<xs:attribute ref="VarId" use="required"/>
<xs:attribute ref="Value" use="required"/>
<xs:attribute ref="DataType" />
</xs:complexType>
</xs:element>
<!-- Root Data Spec -->
<xs:element name="MDASJ">
<xs:complexType>
<xs:sequence>
<xs:element ref="DIH"/>
<xs:element ref="TimeStamp"/>
<xs:element ref="Variable" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute ref="ID" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
当前 XML 文件输出
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<MDASJ ns1:ID="MDASJID" xsi:schemaLocation="http://www.theronyx.com/mdasj/xmldata mdasj-data.xsd" xmlns:ns1="http://www.theronyx.com/mdasj/xmldata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ns1:DIH ns1:ID="servo1"/>
<ns1:Variable ns1:DataType="Numeric" ns1:Value="0.19830813342577691127388561653788201510906219482421875" ns1:VarId="key1"/>
<ns1:Variable ns1:DataType="Text" ns1:Value="-3815206174054821329" ns1:VarId="key2"/>
</MDASJ>
期望的 XML 文件输出是
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<MDASJ ID="MDASJID" xsi:schemaLocation="http://www.theronyx.com/mdasj/xmldata mdasj-data.xsd" xmlns="http://www.theronyx.com/mdasj/xmldata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<DIH ID="servo1"/>
<Variable DataType="Numeric" Value="0.19830813342577691127388561653788201510906219482421875" VarId="key1"/>
<Variable DataType="Text" Value="-3815206174054821329" VarId="key2"/>
</MDASJ>
最佳答案
您可以使用 NamespacePrefixMapper
marshallerDXD.setProperty("com.sun.xml.bind.namespacePrefixMapper",
myNsPrefixMapper);
控制 namespace 前缀:
public class MyNsPrefixMapper extends NamespacePrefixMapper
{
public String getPreferredPrefix(String uri, String suggest, boolean require)
{
if("http://www.theronyx.com/mdasj/xmldata".equals(uri) ){return "";}
return suggest;
}
public String[] getPreDeclaredNamespaceUris()
{
// String[] result = new String[1];
// result[0] = "http://www.theronyx.com/mdasj/xmldata";
return new String[0];
}
}
我测试了编码:
MDASJ xml = ....;
JAXBContext context = JAXBContext.newInstance(MDASJ.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.setProperty(Marshaller.JAXB_ENCODING, "ISO-8859-1");
m.setProperty(Marshaller.JAXB_SCHEMA_LOCATION,
"http://www.theronyx.com/mdasj/xmldata mdasj-data.xsd");
m.setProperty("com.sun.xml.bind.namespacePrefixMapper",new MyPrefixMapper());
m.marshal(xml, System.out);
和这个 JAXB 实现:
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
关于java - 如何使用 JAXB 编码消除元素/属性中自动生成的命名空间前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6880497/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!