GVKun编程网logo

java – 使用带有名称空间和模式的Jaxb进行XML解组(java命名空间)

6

最近很多小伙伴都在问java–使用带有名称空间和模式的Jaxb进行XML解组和java命名空间这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展Java/JAXB:基于属性将XML解

最近很多小伙伴都在问java – 使用带有名称空间和模式的Jaxb进行XML解组java命名空间这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展Java / JAXB:基于属性将XML解组到特定子类、Java / JAXB:将XML属性解组为特定的Java对象属性、java xml批注获取带有名称空间的字段, 值、java – 使用JAXB将XML解组为现有对象等相关知识,下面开始了哦!

本文目录一览:

java – 使用带有名称空间和模式的Jaxb进行XML解组(java命名空间)

java – 使用带有名称空间和模式的Jaxb进行XML解组(java命名空间)

我有一个XML文档,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xs:msgdata xmlns:xs="http://www.myCompany.com" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.myCompany.com msgdata.xsd">
  <xs:msgid>MsgiD001</xs:msgid>
  <xs:msgHash>hlkJKLHljkhkjlHKJLHkjl6y987HJKH</xs:msgHash> 
</xs:msgdata>

还向我发送了一个模式文档(称为msgdata.xsd).我正在使用JAXB将上述xml文档解组为Java对象.
解组代码如下所示:

final JAXBContext context = JAXBContext.newInstance(clazz);
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new File("C:\\temp\\msgdata.xsd"));

final Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setSchema(schema);

return (T) unmarshaller.unmarshal(new StringReader(xml));  

XML的目标对象如下所示(然后将对象转换为休眠实体.

@XmlRootElement(name = "msgdata")
public class Message {

    private     String  msgid;
    private     String  msgHash;

    @XmlElement(name = "msgid")
    public String getMsgid() {
        return msgid;
    }

    public void setMsgid(String msgid) {
        this.msgid = msgid;
    }

    @XmlElement(name = "msgHash")
    public String getMsgHash() {
        return msgHash;
    }
    public void setMsgHash(String msgHash) {
        this.msgHash = msgHash;
    }

几个问题:

>我有一个休息服务,我将收到上面显示格式的XML文档.架构文档的参考是什么.我知道架构文档用于验证XML文档.我认为它的工作方式是我使用该模式来验证我通过REST服务收到的XML文档.现在的问题是我如何访问架构?我只是将它存储在我的文件系统上并访问它,如上所示?

XML文档具有对模式的引用(请参阅schemaLocation条目).它如何在我的文件系统上找到架构文档? XML文档中是否需要该模式引用?

>现在的XML文档无法解组.当我尝试解组时,我收到以下错误:

Caused by: javax.xml.bind.UnmarshalException: unexpected element
(uri:”http://www.myCompany.com”, local:”msgdata”). Expected elements
are <{}msgdata>
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:662)
[jaxb-impl-2.2.4.jar:]
at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:258)
[jaxb-impl-2.2.4.jar:]
at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:253)
[jaxb-impl-2.2.4.jar:]
at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:120)
[jaxb-impl-2.2.4.jar:]
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1063)
[jaxb-impl-2.2.4.jar:]
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:498)
[jaxb-impl-2.2.4.jar:]
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:480)
[jaxb-impl-2.2.4.jar:]
at com.sun.xml.bind.v2.runtime.unmarshaller.ValidatingUnmarshaller.startElement(ValidatingUnmarshaller.java:102)
[jaxb-impl-2.2.4.jar:]
at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:150)
[jaxb-impl-2.2.4.jar:]
at org.apache.xerces.parsers.AbstractSAXParser.startElement(UnkNown
Source) [xercesImpl-2.9.1.jar:]
at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(UnkNown
Source) [xercesImpl-2.9.1.jar:]
at org.apache.xerces.impl.XMLNSDocumentScannerImpl$NSContentdispatcher.scanRootElementHook(UnkNown
Source) [xercesImpl-2.9.1.jar:]
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentdispatcher.dispatch(UnkNown
Source) [xercesImpl-2.9.1.jar:]
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(UnkNown
Source) [xercesImpl-2.9.1.jar:]
at org.apache.xerces.parsers.XML11Configuration.parse(UnkNown Source) [xercesImpl-2.9.1.jar:]
at org.apache.xerces.parsers.XML11Configuration.parse(UnkNown Source) [xercesImpl-2.9.1.jar:]
at org.apache.xerces.parsers.XMLParser.parse(UnkNown Source) [xercesImpl-2.9.1.jar:]
at org.apache.xerces.parsers.AbstractSAXParser.parse(UnkNown Source) [xercesImpl-2.9.1.jar:]
at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(UnkNown
Source) [xercesImpl-2.9.1.jar:]
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:217)
[jaxb-impl-2.2.4.jar:]
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:189)
[jaxb-impl-2.2.4.jar:]
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:136)
[jboss-jaxb-api_2.2_spec-1.0.3.Final.jar:1.0.3.Final]
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:193)
[jboss-jaxb-api_2.2_spec-1.0.3.Final.jar:1.0.3.Final]
… 31 more

我认为命名空间是在xml文档中定义的.我要么没有正确使用架构,要么命名空间定义不正确.我究竟做错了什么?

谢谢.

解决方法:

通常,对于如何访问Java Web应用程序中的文件(XSD或其他)(因为您提到了REST),您可以启动here.从不依赖绝对路径,部署以及安全性原因.

xsi架构位置属性只是提示;他们不是必需的.即使存在,也不必考虑.对于服务器端应用程序,我绝不会使用它们;一个人应该依赖嵌入式资源,或者在可信/安全的位置使用类似目录的概念.

它没有解组的事实在错误消息中很清楚:它需要一个无命名空间的元素< {} msgdata>而不是< {http://www.myCompany.com} msgdata>.

您需要修改XML或修改您的类以包含诸如@XmlElement(name =“…”,namespace =“http://www.myCompany.com”)之类的内容

我会说给定的架构和XML是正确的,你的注释是不同步的.

Java / JAXB:基于属性将XML解组到特定子类

Java / JAXB:基于属性将XML解组到特定子类

是否可以使用JAXB根据xml的属性将xml解组到特定的Java类?

<shapes>
  <shape type="square" points="4" square-specific-attribute="foo" />
  <shape type="triangle" points="3" triangle-specific-attribute="bar" />
</shapes>

我想要一个包含三角形和正方形的Shape对象的列表,每个对象都有自己的特定于形状的属性。IE浏览器:

abstract class Shape {
    int points;
    //...etc
}

class Square extends Shape {
    String square-specific-attribute;
    //...etc
}

class Triangle extends Shape {
    String triangle-specific-attribute;
    //...etc
}

我目前只是将所有属性都放在一个大的“ Shape”类中,这并不理想。

如果形状已正确命名为xml元素,则可以使它正常工作,但是不幸的是,我无法控制要检索的xml。

谢谢!

Java / JAXB:将XML属性解组为特定的Java对象属性

Java / JAXB:将XML属性解组为特定的Java对象属性

有一个丑陋的XML文件必须解组:

<?xml version="1.0" ?>
<configuration>
    <section name="default_options">
        <value name="default_port">8081</value>
        <value name="log_level">WARNING</value>
    </section>
    <section name="custom_options">
        <value name="memory">64M</value>
        <value name="compatibility">yes</value>
    </section>
</configuration>

产生的Java对象应为:

public class DefaultOptions {
    private int defaultPort;
    private String logLevel;
    // etc...
}

public class CustomOptions {
    private String memory;
    private String compatibility;
    // etc...
}

这个问题的答案非常接近,但我不知道最终的解决方案。

java xml批注获取带有名称空间的字段, 值

java xml批注获取带有名称空间的字段, 值

我正在一个没有架构的项目中,我必须手动解析xml响应。我的问题是我无法使用xml注释获得一些价值。

例如,xml类似于:

<?xml version=''1.0'' encoding=''UTF-8'' ?><autnresponse>    <action>QUERY</action>    <response>SUCCESS</response>    <responsedata>        <autn:numhits>7</autn:numhits>    </responsedata></autnresponse>

Java类是:

@XmlAccessorType(XmlAccessType.FIELD)@XmlRootElement(name = "autnresponse")public class AutonomyResponse {    private String action;    private String response;    private ResponseData responsedata;}@XmlAccessorType(XmlAccessType.FIELD)@XmlType(name = "responsedata")public class ResponseData {    @XmlElement(name = "numhits",namespace = "autn")    private String numhits;    @XmlElement(name = "totalhits")    private String totalhits;}

我可以获取操作和响应,但不能在responsedata中获取数字,有人可以告诉我如何处理<autn:numhits>using注释吗?太感谢了!

另一个问题是:我<autn:numhits>的响应数据中有多个…。如何获取Java代码中的所有值。
->我解决了多个相同的标签,只需设置List,注释将自动生成列表

答案1

小编典典

事实是 autn- 仅是前缀,而不是名称空间。为了正确处理XML文档,必须声明名称空间。

正确的名称空间声明:

<?xml version=''1.0'' encoding=''UTF-8'' ?><autnresponse xmlns:autn="http://namespace.here">    <action>QUERY</action>    <response>SUCCESS</response>    <responsedata>        <autn:numhits>7</autn:numhits>    </responsedata></autnresponse>

您还需要更改注释:

@XmlAccessorType(XmlAccessType.FIELD)@XmlType(name = "responsedata")public class ResponseData {    @XmlElement(name = "numhits",namespace = "http://namespace.here")    private String numhits;    @XmlElement(name = "totalhits")    private String totalhits;}

为您提供最终建议。如果您对此XML文档有xsd方案,请使用XJC utilit生成Java代码。

http://docs.oracle.com/javaee/5/tutorial/doc/bnbah.html

java – 使用JAXB将XML解组为现有对象

java – 使用JAXB将XML解组为现有对象

我有一个从一组现有的 java类生成的xsd,目前它成功地将 XML消息解组到对象中,但是我希望能够做的是我有一个现有的Object实例让unmarshaller只需更新传递给它的消息中包含的字段

例如(原谅任何语法错误,它只是在我的头顶)

如果我有一个带有许多字段,标题,作者,已发布等的带注释的类Book和相应的生成的xsd,那么很多字段设置为不需要我想能够获得以下xml

<Book>
 <title>Dummys guide to JAXB</title>
</Book>

而不是简单地创建仅具有标题集的新Book实例,将其应用于现有实例作为更新,因此只需在该实例上设置title变量.

解决方法

JAXB无法为您做到这一点,不.但是,您可以使用JAXB将XML文档解组为新对象,然后将新对象的属性反射复制到现有对象上.

Commons BeanUtils为此提供了一种机制,例如BeanUtils.copyProperties方法.不过,我不确定这是不是很复杂.

关于java – 使用带有名称空间和模式的Jaxb进行XML解组java命名空间的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Java / JAXB:基于属性将XML解组到特定子类、Java / JAXB:将XML属性解组为特定的Java对象属性、java xml批注获取带有名称空间的字段, 值、java – 使用JAXB将XML解组为现有对象的相关信息,请在本站寻找。

本文标签: