我有一个如下所示的 XML:
<content>
<p><b>Node:</b> Some information</p>
</content>
反序列化此 XML 时,我想以字符串形式获取 p 标记内的内容。
例如,如果我有一个如下所示的 java 类:
@Data
class Content {
TextInParagraph p;
}
@Data
class TextInParagraph {
String text;
}
我应该将文本值设置为“<b>Node:</b> Some information
”。
有没有办法使用 JAXB 或 Jackson XML 解析器来完成上述操作?
我尝试在 Jackson 中进行上述反序列化,但出现以下异常:
Expected END_ELEMENT, got event of type 1
java.io.IOException: Expected END_ELEMENT, got event of type 1
最佳答案
遗憾的是,这对于 jackson-dataformat-xml
是不可能的。 .
但是,使用 JAXB,您可以使用 DomHandler
来解决此问题
@XmlRootElement(name = "content")
@XmlAccessorType(XmlAccessType.FIELD)
public class Content {
@XmlAnyElement(InnerXmlHandler.class)
private String p;
}
DomHandler
import javax.xml.bind.ValidationEventHandler;
import javax.xml.bind.annotation.DomHandler;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.StringReader;
import java.io.StringWriter;
public class InnerXmlHandler implements DomHandler<String, StreamResult> {
private static final String START_TAG = "<p>";
private static final String END_TAG = "</p>";
private StringWriter xmlWriter = new StringWriter();
public StreamResult createUnmarshaller(ValidationEventHandler errorHandler) {
return new StreamResult(xmlWriter);
}
public String getElement(StreamResult rt) {
String xml = rt.getWriter().toString();
int beginIndex = xml.indexOf(START_TAG) + START_TAG.length();
int endIndex = xml.lastIndexOf(END_TAG);
return xml.substring(beginIndex, endIndex);
}
public Source marshal(String n, ValidationEventHandler errorHandler) {
try {
String xml = START_TAG + n.trim() + END_TAG;
StringReader xmlReader = new StringReader(xml);
return new StreamSource(xmlReader);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
这适用于您提供的示例,但甚至适用于嵌套 <p>
标签如:
<content>
<p> This is some <ul><li>list</li></ul> and <p>nested paragraph</p></p>
</content>
但是,这仅在内部 HTML/XML 有效时才有效。以下内容将不起作用并抛出类似 The element type "ul" must be terminated by the matching end-tag "</ul>"
的异常.
<content>
<p> This is some <ul>invalid xml </p>
</content>
这是因为 JAXB 内部结构会遍历所有内部元素,尽管提供了 dom 处理程序。
关于java - 在 java 中解析 xml 时,跳过元素的反序列化并以字符串形式获取整个内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54307430/