【问题标题】:JAVA XML Parsing with namespaces using JAXB annotations使用 JAXB 注释的命名空间的 JAVA XML 解析
【发布时间】:2018-11-29 23:28:48
【问题描述】:

我有一个来自外部端点的巨大 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,但有很多但它们都不会在响应中包含任何命名空间!

谢谢!

【问题讨论】:

  • 您可能应该展示一个您遇到困难的 MCVE。 JAXB 可以很好地处理名称空间。

标签: java xml xml-parsing jaxb jaxb2


【解决方案1】:

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>

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 2019-12-03
    • 2021-05-03
    • 2014-01-10
    • 2019-11-07
    • 2020-10-11
    • 2010-11-08
    相关资源
    最近更新 更多