使用JAXB将子节点中的XML数据作为字符串获取

时间:2011-05-08 21:12:48

标签: java xml jaxb

我正在使用JAXB将XML(Parent XML,FIXML)转换为String。在该XML中,一个子节点具有另一个XML(子XML,FpML)数据,我已经为其创建了模式(xsd)。在Parent XML的模式中,具有Child XML的元素类型被定义为String。我需要孩子XML应该作为字符串。请让我知道我必须做些什么改变。我对JAXB比较陌生。在此先感谢.. !!

干杯, Sakthi S

2 个答案:

答案 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:字符串”