当前位置: 首页 > 知识库问答 >
问题:

使用JAXB注释解析带有名称空间的JAVA XML

惠文彬
2023-03-14

我有一个来自外部endpoint的巨大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;
}

我试过什么?

>

  • 将命名空间信息添加到@XmlRootElement,如下所示

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

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

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

    谢谢大家!

  • 共有1个答案

    通正平
    2023-03-14

    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 central:

    <dependency>
        <groupId>com.github.codemonstur</groupId>
        <artifactId>simplexml</artifactId>
        <version>1.4.0</version>
    </dependency>
    
     类似资料:
    • 我使用JAXB从SOAP响应中解析xml元素。我已经为xml元素定义了POJO类。我已经测试了没有名称空间和前缀的pojo类,它工作得很好。需求是解析来自SOAPMessage对象的输入

    • 问题内容: 这是我的xml,需要将其转换为Java。我用过jaxb 并引发以下异常javax.xml.bind.UnmarshalException:意外元素(uri:“ http://www.ae.com/Event/Load ”,本地:“ Order”)。期望的元素是<{} lm:Order> 这是我的解组代码 订购Pojo班 您能否也帮助我阅读,当前正在读取文件,需要读取为XML Strin

    • 我想使用JAXB来 将xml解组为java对象, 将其封送回xml 并使用名称空间生成完全相同的输出 下面是原始的 XML: 我正在使用以下POJO: 我用于取消/编组的代码: 这实际上不起作用,我甚至无法解组初始xml。但是如果我尝试封送一个POJO,我只在代码中设置字段。我得到以下结果: 我如何摆脱这个ns3前缀?

    • 问题内容: 我知道这个问题已经被问了很多遍了,但是我没有得到任何适合我情况的建议,因此我在网上和这里进行搜索,尝试了所有方法,但没有任何效果。我只需要用命名空间cap解析此XML:并且只需要其中的四个条目。 我正在使用simpleXML,并且设置了一个小的简单测试脚本,它非常适合解析常规元素。我无法为自己的狄更斯找到或获得一种使用命名空间解析元素的方法。 这是一个小示例测试脚本,其中包含我正在使用

    • 问题内容: 我有一个丑陋的XML,上面有很多名称空间,当我尝试通过simpleXML加载它(如果我指示第一个名称空间)时,我会得到一个xml对象,但是后面带有其他名称空间的标记不会使它成为该对象。 如何解析该XML? 我试图用下面的代码解析它 但是$ xml对象仅包含以下内容 问题答案: 我认为您需要注册名称空间并使用XPath进行访问。如下所示的内容应该可以帮助您(我没有设施可以对此进行测试)。

    • 我已经阅读了这里的文章和在使用JAXB时处理数字签名的示例代码,并且遇到了一个问题,我认为是JAXB封送将名称空间引入“signedinfo”元素。 我定义了一个XSD,它将被用不同编程语言实现的多个应用程序使用。我将XSD编译为JAXB注释类,供我的实现(Jersey JAX-RS和JAX-WS)使用。我目前拥有的流量如下: JAXB对象使用适当的数据创建或从远程应用程序传递。 按照Blaise