gpt4 book ai didi

java - 需要不同的父子命名空间前缀

转载 作者:行者123 更新时间:2023-11-30 04:07:21 27 4
gpt4 key购买 nike

我有两个 xsd,我使用 xjc 从中生成了 jaxb pojo。我已经使用 jaxb marshaller 和 jaxb-impl-2.2.6 生成了 XML为此,我已将 NamespacePrefixMapper 重写为 MyNamespacePrefixMapper

父.xsd

 <xs:schema targetNamespace="parent" 
elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:Env="Parent"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:child="urn:xsd:child">
<xs:import namespace="urn:xsd:child" schemaLocation="child.xsd"/>
<xs:element name="parent">
<xs:complexType>
<xs:sequence>
<xs:element name="child" type="child:child1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

子.xsd

  <xs:schema xmlns="urn:xsd:child" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:xsd:child">
<xs:element name="child" type="child1"/>
<xs:complexType name="child1">
<xs:sequence>
<xs:element name="Id" type="Max20Text"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="Max20Text">
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="20"/>
</xs:restriction>
</xs:simpleType>

XmlMarshallingTest.java

 import javax.xml.bind.*;
import javax.xml.stream.XMLStreamException;
import org.junit.Test;
import parent.Parent;
import xsd.child.Child1;
public class XmlMarshallingTest {


@Test
public void testXmlMarshalling() throws JAXBException, XMLStreamException{
Parent envelope = new Parent();
Child1 businessApplicationHeaderV01 = new Child1();
businessApplicationHeaderV01.setId("ABC123");
envelope.setChild(businessApplicationHeaderV01);
JAXBContext context = JAXBContext.newInstance(envelope.getClass());
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", new MyNamespacePrefixMapper());
marshaller.marshal(envelope, System.out);
}
}

MyNamespacePrefixMapper.java

    import com.sun.xml.bind.marshaller.NamespacePrefixMapper;
import com.sun.xml.bind.marshaller.NamespacePrefixMapper;

public class MyNamespacePrefixMapper extends NamespacePrefixMapper {
@Override
public String getPreferredPrefix(String namespaceUri, String suggestion, boolean arg2) {
if("Parent".equals(namespaceUri)) {
return "parentPrefix";
} else if("urn:xsd:child".equals(namespaceUri)) {
return "childPrefix";
}
return "defaultPrefix";
}
}

生成的xml就像

 <parentPrefix:parent xmlns:childPrefix="urn:xsd:child" xmlns:parentPrefix="parent">
<parentPrefix:child>
<childPrefix:Id>ABC123</childPrefix:Id>
</parentPrefix:child>
</parentPrefix:parent>

在这里,我的问题是,我希望 xml 如下所示

 <parentPrefix:parent xmlns:childPrefix="urn:xsd:child" xmlns:parentPrefix="parent">
<childPrefix:child>
<childPrefix:Id>ABC123</childPrefix:Id>
</childPrefix:child>
</parentPrefix:parent>

我期望子标签的前缀是“childPrefix”,但它显示“parentPrefix”父标签生成良好,带有前缀“parentPrefix

环境描述

Maven 3.0.4

Java版本:1.7.0_04

操作系统:Windows 7

最佳答案

您的架构将 parent 元素定义为在父架构自己的 targetNamespace 中具有名为 child 的子元素,其类型恰好来自子命名空间。如果您希望父级使用子架构中定义的 child 元素(因此在 urn:xsd:child 命名空间中),则不要使用

<xs:element name="child" type="child:child1"/>

你需要

<xs:element ref="child:child"/>

关于java - 需要不同的父子命名空间前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20423283/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com