我正在使用JAXB将XML(Parent XML,FIXML)转换为String。在该XML中,一个子节点具有另一个XML(子XML,FpML)数据,我已经为其创建了模式(xsd)。在Parent XML的模式中,具有Child XML的元素类型被定义为String。我需要孩子XML应该作为字符串。请让我知道我必须做些什么改变。我对JAXB比较陌生。在此先感谢.. !!
干杯, Sakthi S
答案 0 :(得分:3)
<强>更新强>
根据您的意见:
嗨..感谢您的回复.. @Blaise 杜根&amp; @CoolBeans在上面 你提供的例子就是你提到的 字符串值,但在我的 xml,而不是那里的“字符串值” 将是其中的另一个XML。喜欢 理查德 我需要的 “理查德”为 输出中的字符串。请让我 知道你还想要更多信息。 谢谢..干杯,Sakthi。小号
您可以使用@XmlAnyElement和DomHandler实现的组合来处理此用例。有关详细示例,请参阅:
更新#2
根据您的评论
你能告诉我什么是改变 需要在架构中完成 提起“@XmlAnyElement”,因为我 我正在生成java类 建立时间。
您可以使用JAXB dom
架构注释来在属性上生成XmlAnyElement:
XJC致电
xjc -d out -b bindings.xml dom.xsd
<强> dom.xsd 强>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.example.com/default"
targetNamespace="http://www.example.com/default">
<xs:element name="customer">
<xs:complexType>
<xs:sequence>
<xs:element ref="address"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="address">
<xs:complexType>
<xs:attribute name="street" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:schema>
<强> bindings.xml 强>
<jxb:bindings
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
version="2.1">
<jxb:bindings schemaLocation="string.xsd">
<jxb:bindings node="//xs:element[@name='customer']/xs:complexType/xs:sequence/xs:element[@ref='address']">
<jxb:dom/>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
<强>客户强>
Customer
上的地址属性将使用@XmlAnyElement
注释:
package com.example._default;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import org.w3c.dom.Element;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"address"
})
@XmlRootElement(name = "customer")
public class Customer {
@XmlAnyElement
protected Element address;
public Element getAddress() {
return address;
}
public void setAddress(Element value) {
this.address = value;
}
}
原始回答
您可能正在寻找@XmlValue注释。例如,如果您有以下类:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD
public class Child {
@XmlValue
private String value;
}
上述课程将编组:
<child>String Value</child>
在相应的XML模式中,子元素的类型为xs:string。
<xs:element name="child" type="xs:string"/>
答案 1 :(得分:1)
我现在用
解决了这个问题@Column(name="xml")
@XmlJavaTypeAdapter(StringXmlAdapter.class)
public String getXml() {
return this.xml;
}
...
public class StringXmlAdapter extends XmlAdapter<Object, String>
{
private static final String XMLSTART = "<?xml version='1.0' encoding='UTF-8'?>";
@Override
public Object marshal(String v) throws Exception {
return v;
}
@Override
public String unmarshal(Object v) throws Exception {
Document document = ((Node) v).getOwnerDocument();
DOMImplementationLS domImplLS = (DOMImplementationLS) document
.getImplementation();
LSSerializer serializer = domImplLS.createLSSerializer();
String str = serializer.writeToString((Node) v);
String normalizedXml = normalizeXml(str);
return normalizedXml;
}
private String normalizeXml(String xml){
int beginIndex = xml.indexOf('>',XMLSTART.length()+1)+1;
int endIndex = xml.lastIndexOf('<');
return xml.substring(beginIndex, endIndex);
}
}
唯一的问题是我得到了
<xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">
<inner><something>lalala</something></inner></xml>
编组后
不知道如何擦除xmlns:xsi =“http://www.w3.org/2001/XMLSchema-instance”xmlns:xs =“http://www.w3.org/2001/XMLSchema”的xsi:type = “XS:字符串”