在JAXB中处理CDATA

时间:2012-09-20 12:09:42

标签: java

我需要解析一个xml文件(我使用JAXB进行解析),但我想将Xml文件值的某些部分转换为字符串。我在网上冲浪后,可以使用CDATA。以下链接谈论CDATA。但我对代码有疑问。我应该在哪里以及如何指定我希望将哪些元素作为CDATA处理。

http://jaxb.java.net/faq/JaxbCDATASample.java

我的XML如下所示。

<root>
    <Service>CDATASERVICE</Service>
    <Child>
        <param>
            <value>
                <struct>
                    <member>
                        <name>Servicename</name>
                        <value>service1</value>
                    </member>
                </struct>
            </value>
        </param>
        <param>
            <value>
                <struct>
                    <member>
                        <name>item1</name>
                        <value>36</value>
                    </member>
                    <member>
                        <name>Cdata</name>
                        <value>
                            <struct>
                                <member>
                                    <name>services</name>
                                    <value>
                                        <array>
                                            <data>
                                                <value>ABCD</value>
                                            </data>
                                        </array>
                                    </value>
                                </member>
                            </struct>
                        </value>
                    </member>
                    <member>
                        <name>item2</name>
                        <value>
                            <int>10</int>
                        </value>
                    </member>
                </struct>
            </value>
        </param>
    </Child>
</root>

我想从上面的XML文件中将以下部分作为字符串,我该怎么做。

                 <name>Cdata</name>
                            <value>
                                <struct>
                                    <member>
                                        <name>services</name>
                                        <value>
                                            <array>
                                                <data>
                                                    <value>ABCD</value>
                                                </data>
                                            </array>
                                        </value>
                                    </member>
                                </struct>
                            </value>

1 个答案:

答案 0 :(得分:1)

您可以使用@XmlAnyElement为此用例指定DomHandler

<强> MemberHandler

@XmlAnyElement注释允许您将XML文档的某些部分保留为XML。默认情况下,它保留为DOM节点。通过实施DomHandler,您可以利用替代表示,例如String

package forum12512299;

import java.io.*;
import javax.xml.bind.ValidationEventHandler;
import javax.xml.bind.annotation.DomHandler;
import javax.xml.transform.Source;
import javax.xml.transform.stream.*;

public class MemberHandler implements DomHandler<String, StreamResult> {

    private static final String MEMBER_START_TAG = "<member>";
    private static final String MEMBER_END_TAG = "</member>";

    private StringWriter xmlWriter;

    public StreamResult createUnmarshaller(ValidationEventHandler errorHandler) {
        xmlWriter = new StringWriter();
        return new StreamResult(xmlWriter);
    }

    public String getElement(StreamResult rt) {
        String xml = rt.getWriter().toString();
        int beginIndex = xml.indexOf(MEMBER_START_TAG) + MEMBER_START_TAG.length();
        int endIndex = xml.indexOf(MEMBER_END_TAG);
        return xml.substring(beginIndex, endIndex);
    }

    public Source marshal(String n, ValidationEventHandler errorHandler) {
        try {
            String xml = MEMBER_START_TAG + n.trim() + MEMBER_END_TAG;
            StringReader xmlReader = new StringReader(xml);
            return new StreamSource(xmlReader);
        } catch(Exception e) {
            throw new RuntimeException(e);
        }
    }

}

<强> STRUCT

以下是DomHandler映射引用@XmlAnyElement的示例。

package forum12512299;

import java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class Struct {

    private List<String> members;

    @XmlAnyElement(MemberHandler.class)
    public List<String> getMembers() {
        return members;
    }

    public void setMembers(List<String> members) {
        this.members = members;
    }

}

<强> input.xml中

下面我将您的XML文档简化为有趣的部分:

<struct>
    <member>
        <name>item1</name>
        <value>36</value>
    </member>
    <member>
        <name>Cdata</name>
        <value>
            <struct>
                <member>
                    <name>services</name>
                    <value>
                        <array>
                            <data>
                                <value>ABCD</value>
                            </data>
                        </array>
                    </value>
                </member>
            </struct>
        </value>
    </member>
    <member>
        <name>item2</name>
        <value>
            <int>10</int>
        </value>
    </member>
</struct>

<强>演示

package forum12512299;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Struct.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum12512299/input.xml");
        Struct struct = (Struct) unmarshaller.unmarshal(xml);

        for(String string : struct.getMembers()) {
            System.out.println(string);
        }
    }

}

<强>输出

<name>item1</name><value>36</value>

<name>Cdata</name><value><struct><member><name>services</name><value><array><data><value>ABCD</value>
                            </data>
                        </array>
                    </value>

<name>item2</name><value><int>10</int>
        </value>