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

回到顶部