![](/img/trans.png)
[英]How do I specify XML serialization attributes to support namespace prefixes during deserialization in .NET?
[英]XML Marshalling: I want namespace attributes and not prefixes
我有一个非常复杂的XML树,该树在架构中具有多个名称空间。 我设法生成了相应的Jaxb(使用Eclipse IDE),并且marshaller / unmarshaller运行正常。
现在,我希望将XML转换为特定格式,因为我需要将其提供给某些系统,并且没有其他选择。
生成的XML为:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ns2:data xmlns:ns2="ns:example-main" xmlns:ns10="ns:example-main/mynamespace10" xmlns:ns11="http://www.w3.org/1999/XSL/Transform" xmlns:ns4="ns:example-main/mynamespace5" xmlns:ns5="ns:example-main/mynamespace6" xmlns:ns6="ns:example-main/mynamespace111" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="ns:example-main resource:example-main">
<ns6:ruleList>
<ns6:rule>
<ns6:name>DFAC</ns6:name>
<ns6:className>com.example.Rule</ns6:className>
<ns6:label>DFAC class</ns6:label>
</ns6:rule>
</ns6:ruleList>
</ns2:data>
我需要生成的XML
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<data xmlns="ns:example-main" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="ns:example-main resource:example-main">
<ruleList xmlns="ns:example-main/Rule" xsi:schemaLocation="ns:example-main/Rule resource:Rule">
<rule>
<name>DFAC</name>
<className>com.example.Rule</className>
<label>DFAC class</label>
</rule>
</ruleList>
</data>
我正在使用Jaxb RI 2.2.6,到目前为止我已经做了:1。
myjaxbMarshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", new MyNamespaceMapper());
并从方法返回“”
带有xmlns的@XmlSchema批注
@XmlSchema(namespace =“ example-main”,xmlns = {@ javax.xml.bind.annotation.XmlNs(namespaceURI =“ ns:example-main”,prefix =“”)))
写入DOM树并使用dom的命名空间配置,然后封送dom:
doc.getDomConfig()。setParameter(“ namespaces”,true); doc.getDomConfig()。setParameter(“ namespace-declarations”,true); doc.normalizeDocument();
或在上述各行中将名称空间设置为false,以完全摆脱名称空间,但这无济于事
您可以尝试使用NamespacePrefixMapper
。 您必须对其进行扩展并将其设置为属性。
这是最短方法的示例:
marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper",
new NamespacePrefixMapper() {
@Override
public String[] getPreDeclaredNamespaceUris() {
return new String[] { MyNamespaces.EXAMPLE_MAIN };
}
@Override
public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
if (namespaceUri.equals(MyNamespaces.EXAMPLE_MAIN) ||
namespaceUri.equals(MyNamespaces.EXAMPLE_MAIN_RULE))
return "";
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.