我需要解析一个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>
答案 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>