java - 在 java 中解析 xml 时,跳过元素的反序列化并以字符串形式获取整个内容

标签 java xml jackson jaxb jackson-dataformat-xml

我有一个如下所示的 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/

相关文章:

java - 在现有模型对象内传递对象,其中新对象参数未定义并且可能会更改

java - 尽管优先级设置为最高,但在 Android 4.4 及更高版本上消息不会被阻止。有解决方法吗?

java - Jackson 将字符串转换为对象

java - 如何通过 Jackson 2 JsonNode 树遍历 JSON?

SQL Server : Multiple rows XML

java - $Proxy0(来源不明)jboss

javascript - UI5 - 具有 XML 模型渲染问题的 TreeTable

java - 2.2 中与布局安排相关的 Android 微调器错误

java - 处理语言: Get inner array values from ArrayList()

java - 如何避免重复捕获模拟方法的异常,这些异常可能会根据接口(interface)抛出异常