Castor XML Mapping 与子节点同名

Posted

技术标签:

【中文标题】Castor XML Mapping 与子节点同名【英文标题】:Castor XML Mapping same name with the child node 【发布时间】:2013-11-20 06:08:36 【问题描述】:

我在尝试解析包含相同名称的父节点和子节点的 xml 时遇到了 castor 的问题...以下是详细信息:

这是映射文件的一部分:

<class name="com.somepackage.Item">
    <field name="id" type="java.lang.long">
      <bind-xml name="itemiD" node="element"/>
    </field>
    <field name="amount" type="com.somepackage.Amount">
      <bind-xml name="amount" />
    </field>
</class>
<class name="com.somepackage.Amount" >
  <field name="amount" type="java.lang.String">
    <bind-xml name="amount" />
  </field>
  <field name="currency" type="java.lang.String">
    <bind-xml name="currency" />
  </field>
</class>

这是我要解析的 xml:

<?xml version="1.0" encoding="UTF-8"?>
<list xmlns="http://someurl">
<item>
<itemID>42425</itemID>
<amount>
  <amount>10.00</amount>
  <currency>EUR</currency>
</amount>
<item>
</list>

这是与上述内容相关的错误日志:

[#|2013-11-20T13:48:54.670+0800|INFO|glassfish3.1.2|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=32;_ThreadName=Thread-2;| 13-11-20 13:48:54 错误 util.XMLConvertUtil http-thread-pool-8181(1) - org.exolab.castor.xml.MarshalException:非法文本数据发现为子项:数量 值:“10.00”文件:[不可用];行:14;列:29 org.exolab.castor.xml.MarshalException:非法文本数据发现为子项:数量 值:“10.00”文件:[不可用];行:14;列:29 在 org.exolab.castor.xml.Unmarshaller.convertSAXExceptionToMarshalException(Unmarshaller.java:761) 在 org.exolab.castor.xml.Unmarshaller.unmarshal(Unmarshaller.java:727) 在 org.exolab.castor.xml.Unmarshaller.unmarshal(Unmarshaller.java:616) 在 some.package.XMLConvertUtil.xmlToObject(XMLConvertUtil.java:58) 在 some.package.ConverUtil.xmlToPojo(ConverUtil.java:31) 在 some.package.XMLParser.process(XMLParser.java:89) 在 some.package.XMLParser.doPost(XMLParser.java:1063) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:688) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:770) 在 org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 在 org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) 在 org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161) 在 org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) 在 com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317) 在 com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) 在 com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860) 在 com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757) 在 com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056) 在 com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229) 在 com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 在 com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 在 com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 在 com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 在 com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 在 com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 在 com.sun.grizzly.ContextTask.run(ContextTask.java:71) 在 com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 在 com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 在 java.lang.Thread.run(Thread.java:662) 原因:org.xml.sax.SAXException:非法文本数据发现为子项:数量 值:“10.00” 在 org.exolab.castor.xml.UnmarshalHandler.endElement(UnmarshalHandler.java:874) 在 org.exolab.castor.xml.UnmarshalHandler.endElement(UnmarshalHandler.java:1159) 在 com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:601) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1782) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2938) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511) 在 com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808) 在 com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) 在 com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119) 在 com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205) 在 com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) 在 org.exolab.castor.xml.Unmarshaller.unmarshal(Unmarshaller.java:715) ... 31 更多 原因:org.xml.sax.SAXException:非法文本数据发现为子项:数量 值:“10.00” 在 org.exolab.castor.xml.UnmarshalHandler.endElement(UnmarshalHandler.java:874) 在 org.exolab.castor.xml.UnmarshalHandler.endElement(UnmarshalHandler.java:1159) 在 com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:601) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1782) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2938) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511) 在 com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808) 在 com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) 在 com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119) 在 com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205) 在 com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) 在 org.exolab.castor.xml.Unmarshaller.unmarshal(Unmarshaller.java:715) 在 org.exolab.castor.xml.Unmarshaller.unmarshal(Unmarshaller.java:616) 在 some.package.XMLConvertUtil.xmlToObject(XMLConvertUtil.java:58) 在 some.package.ConverUtil.xmlToPojo(ConverUtil.java:31) 在 some.package.XMLParser.process(XMLParser.java:89) 在 some.package.XMLParser.doPost(XMLParser.java:1063) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:688) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:770) 在 org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 在 org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) 在 org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161) 在 org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) 在 com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317) 在 com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) 在 com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860) 在 com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757) 在 com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056) 在 com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229) 在 com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 在 com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 在 com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 在 com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 在 com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 在 com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 在 com.sun.gr|#] [#|2013-11-20T13:48:54.671+0800|INFO|glassfish3.1.2|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=32;_ThreadName=Thread-2;| izzly.ContextTask.run(ContextTask.java:71) 在 com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 在 com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 在 java.lang.Thread.run(Thread.java:662) |#]

我需要更改映射中的某些内容是错误还是其他问题?无法更改 xml 及其架构,因为我是从第三方获取的。如果无法处理这种更改映射等问题,我应该使用另一个解析器吗?

【问题讨论】:

【参考方案1】:

我尝试编辑问题,但没有足够的代表发表评论,但这个问题似乎与 https://***.com/questions/16650013/parsing-with-castor-xml-parser 相同。

在那里,有一条评论指出,castor 无法解析子元素和父元素具有相同名称的元素。有了它,您将不得不更改其中一个。

【讨论】:

谢谢你的更新,其实我前段时间也发现了同样的关于蓖麻的事情,忘记更新这个问题了。

以上是关于Castor XML Mapping 与子节点同名的主要内容,如果未能解决你的问题,请参考以下文章

解析同名的 Xml 节点

求助Matlab Error: Java exception occurred

xStream转换xml同名节点到java对象问题

使用 ADF 将文件夹从具有 2 级子文件夹的 azure 容器移动到与子文件夹同名的容器级

[原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),pro

C# 解析XML文件,使用XmlNode["..."]的方式能访问到此节点下的多个同名节点吗?