首页 > 解决方案 > 使用 JAXB 注释的命名空间的 JAVA XML 解析

问题描述

我有一个来自外部端点的巨大 XML 响应。我想解析对 java 类的 XML 响应。如果没有一个 XML 有命名空间,那么我就能够解析成相应的 POJOS,并且在那之前一切都很顺利。

但是,响应可能仅在根元素处包含名称空间。例如,像这样

<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="somevalue here" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <RestOfTheDocument> something here </RestOfTheDocument>
</Document>

我可以保证没有任何内部 xml 元素会有更多的命名空间。

有没有办法实现这个?我看到了一些完全忽略名称空间的答案,但感觉不是很有说服力。有没有办法正确解析这些。

这是我的用于建模 XML 响应的 java 类

@XmlRootElement(name = "Document")
static class Response {
    @XmlElement(name = "RestOfTheDocument", required = true, nillable = false)
    RestOfTheDocument restOfTheDocument;
}

我试过什么?

  1. 像这样将命名空间信息添加到 @XmlRootElement

     @XmlRootElement(name = "Document", namespace = "somevalue here")
    

这样做会使所有内部 xml 元素为 NULL。

注意:我已将巨大的内部级别抽象为 RestOfTheDocument,但有很多但它们都不会在响应中包含任何名称空间!

谢谢!

标签: javaxmlxml-parsingjaxbjaxb2

解决方案


SimpleXml 将忽略命名空间并仅解析 XML:

public class Document {
    public String RestOfTheDocument;
}

final String data = ...;
final SimpleXml simple = new SimpleXml();
final Document document = simple.fromXml(data, Document.class);
System.out.println(document.RestOfTheDocument);

这将输出:

something here

从 Maven 中心:

<dependency>
    <groupId>com.github.codemonstur</groupId>
    <artifactId>simplexml</artifactId>
    <version>1.4.0</version>
</dependency>

推荐阅读