`
bigboy
  • 浏览: 169894 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

org.xml.sax.SAXException: Invalid element

阅读更多

今天开发项目遇到一个问题,简单记录下,希望能帮到遇到同样问题的同学

 

我使用Axis1.4开发webservice客户端,客户端代码如下:

 Service service = new Service();

Call call;

try {

call = (Call)service.createCall();

call.setTargetEndpointAddress(d2Url);

 

QName qn = new QName("", "CMSID");

call.addParameter(qn, XMLType.SOAP_STRING, ParameterMode.IN);

 

QName qn2 = new QName("", "CorrelateID");

call.addParameter(qn2, XMLType.SOAP_STRING, ParameterMode.IN);

 

QName qn3 = new QName("", "ContentMngXMLURL");

call.addParameter(qn3, XMLType.SOAP_STRING, ParameterMode.IN);

 

call.setReturnClass(ContentDeployReqResponse.class);

QName mapping = new QName("iptv", "ContentPreloadReqResponse");

 

call.registerTypeMapping(ContentDeployReqResponse.class, mapping,

new BeanSerializerFactory(ContentDeployReqResponse.class, mapping), 

new BeanDeserializerFactory(ContentDeployReqResponse.class, mapping));

 

call.setOperationName(new QName("iptv", "ContentPreloadReq"));

return call;

} catch (ServiceException e) {

e.printStackTrace();

}catch(Exception e){

e.printStackTrace();

}

return null;

 

ContentDeployReqResponse类代码如下:

import java.io.Serializable;

 

import javax.xml.bind.annotation.XmlAccessType;

import javax.xml.bind.annotation.XmlAccessorType;

import javax.xml.bind.annotation.XmlElement;

 

@XmlAccessorType(XmlAccessType.FIELD)

public class ContentDeployReqResponse implements Serializable{

 

/**

*/

private static final long serialVersionUID = -6709028467973715698L;

 

@XmlElement(name = "ErrorDescription")

private String errorDescription;

 

@XmlElement(name = "ResultCode")

private int resultCode;

 

 

public int getResultCode() {

return resultCode;

}

 

public void setResultCode(int resultCode) {

this.resultCode = resultCode;

}

 

public String getErrorDescription() {

return errorDescription;

}

 

public void setErrorDescription(String errorDescription) {

this.errorDescription = errorDescription;

}

 

 

}

 

 

调用服务端后返回的xml如下:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">

<S:Body>

<ns2:ContentPreloadReqResponse xmlns:ns2="iptv">

<return>

<ResultCode>0</ResultCode>

<ErrorDescription>success</ErrorDescription>

</return>

</ns2:ContentPreloadReqResponse>

</S:Body>

</S:Envelope>

Axis在解析xml为ContentDeployReqResponse  时出现以下错误:

[2013-12-19 17:51:24,234 ERROR] Exception: org.apache.axis.client.Call.invoke(Call.java:2469)

org.xml.sax.SAXException: Invalid element in opt.fonsview.cmm.ws.ContentDeployReqResponse - ResultCode

at org.apache.axis.encoding.ser.BeanDeserializer.onStartChild(BeanDeserializer.java:258)

at org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1035)

at org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:165)

at org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:1141)

at org.apache.axis.message.RPCElement.deserialize(RPCElement.java:236)

at org.apache.axis.message.RPCElement.getParams(RPCElement.java:384)

at org.apache.axis.client.Call.invoke(Call.java:2467)

at org.apache.axis.client.Call.invoke(Call.java:2366)

 

at org.apache.axis.client.Call.invoke(Call.java:1812)

 

首先想到的是将ContentDeployReqResponse  中的属性首字母大写,发现还是出现以上问题,查看源代码,Axis用到的是javax.bean相关类来生成ContentDeployReqResponse  类信息,我猜测应该是为了跟java规范保持一致,所以在保存属性名的时候是将首字母小写,而返回的xml中首字母是大写,导致出错。

 

采用第二种方法,改写Axis相关源码,替换jar包中文件,运行成功,改写的源文件为org.apache.axis.encoding.ser.BeanDeserializer 的onStartChild方法   

改写之前:

if (propDesc == null) {

            // look for a field by this name. 

        propDesc = (BeanPropertyDescriptor) propertyMap.get(localName);

 

 

}

改写之后:

if (propDesc == null) {

            // look for a field by this name.

        for(Iterator iter = propertyMap.keySet().iterator(); iter.hasNext();){

        String key = (String)iter.next();

        if(key.equalsIgnoreCase(localName)){

        propDesc = (BeanPropertyDescriptor) propertyMap.get(key);

        break;

        }

        }

 

        }

 

开发过程中还遇到一个问题未解决:Axis在解析返回的XML时耗费的时间过长,达10分钟之久,发现问题出在InputStream的read方法上,什么原因?欢迎碰到相同的同学一起探讨

 

附件为修改后的axis jar包

 

分享到:
评论
3 楼 g24317854 2017-08-08  
感谢,遇到同样的问题,确实是返回首字母大写的问题
2 楼 lvweifang 2017-02-15  
差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评差评 
1 楼 chen_juns 2016-04-18  
谢谢博主,按照你方案已解决

相关推荐

    soap消息解析.rar

    SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于在Web服务中交换结构化和类型化的信息。SOAP消息解析是理解、处理和构建SOAP请求和响应的关键步骤。在这个"soap消息解析.rar"压缩包中,包含的是...

    cvc-complex-type.2.4.d: Invalid content was found

    在XML Schema设计中,"cvc-complex-type.2.4.d: Invalid content was found" 是一个常见的错误信息,这通常意味着在解析XML文档时,遇到了不符合定义的复杂类型的内容。这个错误通常涉及到XML Schema的约束规则,即...

    解析XML所需的jar sax.jar

    1. **SAX解析器接口**:`org.xml.sax.XMLReader`是SAX解析器的核心接口,它负责读取XML文档并触发事件。 2. **内容处理器**:在SAX解析过程中,我们需要实现`org.xml.sax.ContentHandler`接口,该接口定义了一系列...

    java调用.net发布的webservice(asmx)

    1. 添加CXF依赖:在Java项目的pom.xml文件中引入Apache CXF的依赖,确保能使用CXF的工具生成客户端代码。 2. 使用WSDL2Java工具:通过.NET ASMX Web服务的WSDL地址,运行CXF的WSDL2Java命令生成Java客户端代码。这...

    sax解析xml本地读取xml

    import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SaxXmlReader extends DefaultHandler { public static void main(String[] args) { try { SAXParserFactory ...

    android layout XML解析错误的解决方法

    首先,让我们来看看标题和描述中提到的具体错误:"org.xmlpull.v1.XmlPullParserException: PI must not start with xml" 和 "org.xml.sax.SAXParseException: PI must not start with xml"。这两个错误都是由于XML...

    一个关于sax解析xml的demo

    import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class MySAXHandler extends DefaultHandler { @Override public void startElement(String uri, String localName, ...

    android_中对xml_进行解析.doc

    import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import java.io.File; public class SAXExample extends DefaultHandler { public static void main(String[] args) { try { ...

    System.XML.dll System.XML.DLL

    在处理大型XML文件时,可以考虑使用SAX(Simple API for XML)模型的`XmlReader`或基于XPath的`XPathDocument`,它们只读取和处理当前节点,降低了内存占用。 总结,`System.XML.dll`是.NET开发中处理XML的重要库,...

    Xml-GET-SAX.zip_get2326

    import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.SAXParserFactory; public class SaxExample extends DefaultHandler { ...

    Java解析XML文档(二):sax读取xml文件导出excel

    首先,创建一个继承自`org.xml.sax.helpers.DefaultHandler`的类,重写其中的方法,如`startElement()`、`endElement()`和`characters()`,以处理XML元素的开始、结束和字符数据。 2. **注册解析器**: 使用`org....

    Java解析XML汇总DOM_SAX_JDOM_DOM4j_XPath

    import org.xml.sax.SAXException; /** * DOM读取XML示例 * @author whwang */ public class TestDom { public static void main(String[] args) { read(); } public static void read() { ...

    xml.rar_XML读取和显示_xml_xml 解析器_读取xml并显示

    import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.InputSource; class MyHandler extends DefaultHandler { // ... 实现事件处理器方法 ... @Override public void ...

    Unity3D中Mono.Xml和XmlParser的使用

    XmlParser 是另一种用于解析XML的工具,它是基于SAX(Simple API for XML)的解析器,适合处理大体积的XML文件,因为它采用事件驱动的方式,不会一次性加载整个XML文档到内存中。这种方式可以有效避免内存消耗过大的...

    SAX解析超大XML文件 示例代码

    import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers....

    java调用net开发的webservice实例

    javax.wsdl.WSDLException: WSDLException: faultCode=PARSER_ERROR: Problem parsing '- WSDL Document -'.: org.xml.sax.SAXParseException: The element type "p" must be terminated by the matching end-tag ...

    java_xml.rar_XML java_java xml_java 读取 本地文件

    import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SAXReader extends DefaultHandler { @Override public void startElement(String uri, String localName, String ...

    Java使用sax、dom、dom4j解析xml文档

    import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SaxExample extends DefaultHandler { @Override public void startElement(String uri, String localName, String ...

    Android XML解析——Sax解析XML

    import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; public class MyContentHandler extends DefaultHandler { @Override public void startElement...

Global site tag (gtag.js) - Google Analytics