最近很多小伙伴都在问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 / JAXB:将XML属性解组为特定的Java对象属性
- java xml批注获取带有名称空间的字段, 值
- java – 使用JAXB将XML解组为现有对象
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解组到特定子类
是否可以使用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对象属性
有一个丑陋的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批注获取带有名称空间的字段, 值
我正在一个没有架构的项目中,我必须手动解析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解组为现有对象
例如(原谅任何语法错误,它只是在我的头顶)
如果我有一个带有许多字段,标题,作者,已发布等的带注释的类Book和相应的生成的xsd,那么很多字段设置为不需要我想能够获得以下xml
<Book> <title>Dummys guide to JAXB</title> </Book>
而不是简单地创建仅具有标题集的新Book实例,将其应用于现有实例作为更新,因此只需在该实例上设置title变量.
解决方法
Commons BeanUtils为此提供了一种机制,例如BeanUtils.copyProperties方法.不过,我不确定这是不是很复杂.
关于java – 使用带有名称空间和模式的Jaxb进行XML解组和java命名空间的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Java / JAXB:基于属性将XML解组到特定子类、Java / JAXB:将XML属性解组为特定的Java对象属性、java xml批注获取带有名称空间的字段, 值、java – 使用JAXB将XML解组为现有对象的相关信息,请在本站寻找。
本文标签: