JAXB混合内容列表包含换行符
我希望您能够为我解决有关JAXB的问题提供帮助。
我有以下XML文件:
<root> <prop>
<field1>
<value1>v1</value1>
<value2>v2</value2>
</field1>
<field2>
<value1>v1</value1>
<value2>v2</value2>
</field2>
</prop>
<prop>
text
<field1>
<value1>v1</value1>
<value2>v2</value2>
</field1>
</prop>
<prop>
text
</prop>
</root>
XML可以在属性下包含其他元素(field1,field2),文本或两者。
和以下类:
@XmlAccessorType(XmlAccessType.FIELD)@XmlRootElement(name = "root")
public class Root {
protected List<Root.Element> prop;
@XmlAccessorType(XmlAccessType.FIELD)
public static class Element {
@XmlMixed
protected List<String> content;
@XmlElement
public Field1 field1;
@XmlElement
public Field2 field2;
@XmlAccessorType(XmlAccessType.FIELD)
public static class Field1 {
@XmlElement
protected String value1;
@XmlElement
protected String value2;
}
@XmlAccessorType(XmlAccessType.FIELD)
public static class Field2 {
@XmlElement
protected String value1;
@XmlElement
protected String value2;
}
}
}
我想将XML解组到上述类中。我遇到的问题是,在内容列表中,除了文本之外,还有其他字符,例如换行符和制表符。更具体地说,基于上述XML,当我尝试解组时会得到:
- 内容为[“ \ n \ t \ t”,“ \ n \ t \ t”,“ \ n \ t”]等的第一个道具-应该为空列表
- 第二个内容为[“ \ n \ t \ ttext \ n \ t \ t”,“ \ n \ t”]之类的道具-应该是一个字符串列表
- 第三个道具的内容如[“ \ n \ t \ ttext \ n \ t”]-应该是一个空列表
我已经尝试创建一个XMLAdapter,但是它适用于列表中的每个元素,因此如果我删除\ n和\
t并返回null(如果它是一个空字符串),我仍然会得到一个包含一些字符串和一些null的列表价值观。
回答:
回答:
具有混合上下文的元素中的空白内容被视为重要内容。
回答:
您可以将JAXB与StAX一起使用以支持此用例。使用StAX,您可以创建一个经过过滤的过滤器,XMLStreamReader
以便任何仅包含空格的字符串都不会报告为事件。下面是如何实现它的示例。
import javax.xml.bind.*;import javax.xml.stream.*;
import javax.xml.transform.stream.StreamSource;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Root.class);
XMLInputFactory xif = XMLInputFactory.newFactory();
XMLStreamReader xsr = xif.createXMLStreamReader(new StreamSource("src/forum22284324/input.xml"));
xsr = xif.createFilteredReader(xsr, new StreamFilter() {
@Override
public boolean accept(XMLStreamReader reader) {
if(reader.getEventType() == XMLStreamReader.CHARACTERS) {
return reader.getText().trim().length() > 0;
}
return true;
}
});
Unmarshaller unmarshaller = jc.createUnmarshaller();
Root root = (Root) unmarshaller.unmarshal(xsr);
}
}
以上是 JAXB混合内容列表包含换行符 的全部内容, 来源链接: utcz.com/qa/411650.html