String转xml,字符串中含有

时间:2022-09-23 22:52:22
xml中内容是读取出来的不能确定,只能替换或者去掉某个字符

package com.clinet;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;

public class Test {

/**
 * @param args
 */
char [] chars = {0x0, 0x1, 0x2, 0x3, 0x4, 0x5};
private String filterText(String message) {
for (int i = 0; i < chars.length; i++) {
message = message.replaceAll(String.valueOf(chars[i]), "");
}
return message;
}
public static void main(String[] args) {
String message = "<?xml version='1.0' encoding='UTF-8'?>" +
"<SMSMSGRECEIVES>" +
"<SMSMSGRECEIVE>" +
"<MSGID>2014062940010629110513337600</MSGID>" +
"<DESTTERMID>12345</DESTTERMID>" +
"<SRCTERMID>13301639266</SRCTERMID>" +
"<MSGCONTENT>:- < & </MSGCONTENT>" +
"<RECVTIME>2014-06-29 11:05:14</RECVTIME>" +
"</SMSMSGRECEIVE>" +
"<SMSMSGRECEIVE>"+
"<MSGID>2014062940010629105000767600</MSGID>"+
    "<DESTTERMID>12345</DESTTERMID>"+
    "<SRCTERMID>13301639266</SRCTERMID>"+
    "<MSGCONTENT> ?行情波段定,不固定。</MSGCONTENT>"+
    "<RECVTIME>2014-06-29 10:50:02</RECVTIME>"+
    "</SMSMSGRECEIVE>"+
"</SMSMSGRECEIVES>";
Test t = new Test();
message = t.filterText(message);
System.out.println(message);
try {
Document document = DocumentHelper.parseText(message);
/*List<Element> elements = document.getRootElement().elements(
Constants.ELEMENT_NAME_SMSMSGRECEIVE);*/

} catch (DocumentException e) {
System.out.println("come on");
e.printStackTrace();
}
}
}


包含"<"运行抛错:

<?xml version='1.0' encoding='UTF-8'?><SMSMSGRECEIVES><SMSMSGRECEIVE><MSGID>2014062940010629110513337600</MSGID><DESTTERMID>12345</DESTTERMID><SRCTERMID>13301639266</SRCTERMID><MSGCONTENT>:- <  </MSGCONTENT><RECVTIME>2014-06-29 11:05:14</RECVTIME></SMSMSGRECEIVE><SMSMSGRECEIVE><MSGID>2014062940010629105000767600</MSGID><DESTTERMID>12345</DESTTERMID><SRCTERMID>13301639266</SRCTERMID><MSGCONTENT> ?行情波段定,不固定。</MSGCONTENT><RECVTIME>2014-06-29 10:50:02</RECVTIME></SMSMSGRECEIVE></SMSMSGRECEIVES>
come on
org.dom4j.DocumentException: Error on line 1 of document  : The content of elements must consist of well-formed character data or markup. Nested exception: The content of elements must consist of well-formed character data or markup.
at org.dom4j.io.SAXReader.read(SAXReader.java:350)
at org.dom4j.DocumentHelper.parseText(DocumentHelper.java:216)
at com.clinet.Test.main(Test.java:41)
Nested exception: 
org.xml.sax.SAXParseException: The content of elements must consist of well-formed character data or markup.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:174)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:388)
at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1427)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.startOfMarkup(XMLDocumentFragmentScannerImpl.java:2606)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2704)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:647)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
at org.dom4j.io.SAXReader.read(SAXReader.java:334)
at org.dom4j.DocumentHelper.parseText(DocumentHelper.java:216)
at com.clinet.Test.main(Test.java:41)
Nested exception: org.xml.sax.SAXParseException: The content of elements must consist of well-formed character data or markup.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:174)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:388)
at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1427)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.startOfMarkup(XMLDocumentFragmentScannerImpl.java:2606)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2704)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:647)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
at org.dom4j.io.SAXReader.read(SAXReader.java:334)
at org.dom4j.DocumentHelper.parseText(DocumentHelper.java:216)
at com.clinet.Test.main(Test.java:41)

27 个解决方案

#1



包含"&"运行抛错:
[code=java]
<?xml version='1.0' encoding='UTF-8'?><SMSMSGRECEIVES><SMSMSGRECEIVE><MSGID>2014062940010629110513337600</MSGID><DESTTERMID>12345</DESTTERMID><SRCTERMID>13301639266</SRCTERMID><MSGCONTENT>:- &  </MSGCONTENT><RECVTIME>2014-06-29 11:05:14</RECVTIME></SMSMSGRECEIVE><SMSMSGRECEIVE><MSGID>2014062940010629105000767600</MSGID><DESTTERMID>12345</DESTTERMID><SRCTERMID>13301639266</SRCTERMID><MSGCONTENT> ?行情波段定,不固定。</MSGCONTENT><RECVTIME>2014-06-29 10:50:02</RECVTIME></SMSMSGRECEIVE></SMSMSGRECEIVES>
come on
org.dom4j.DocumentException: Error on line 1 of document  : The entity name must immediately follow the '&' in the entity reference. Nested exception: The entity name must immediately follow the '&' in the entity reference.
at org.dom4j.io.SAXReader.read(SAXReader.java:350)
at org.dom4j.DocumentHelper.parseText(DocumentHelper.java:216)
at com.clinet.Test.main(Test.java:41)
Nested exception: 
org.xml.sax.SAXParseException: The entity name must immediately follow the '&' in the entity reference.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:174)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:388)
at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1427)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEntityReference(XMLDocumentFragmentScannerImpl.java:1846)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3033)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:647)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
at org.dom4j.io.SAXReader.read(SAXReader.java:334)
at org.dom4j.DocumentHelper.parseText(DocumentHelper.java:216)
at com.clinet.Test.main(Test.java:41)
Nested exception: org.xml.sax.SAXParseException: The entity name must immediately follow the '&' in the entity reference.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:174)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:388)
at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1427)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEntityReference(XMLDocumentFragmentScannerImpl.java:1846)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3033)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:647)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
at org.dom4j.io.SAXReader.read(SAXReader.java:334)
at org.dom4j.DocumentHelper.parseText(DocumentHelper.java:216)
at com.clinet.Test.main(Test.java:41)


[/code]

#2


用<![CDATA[""]]>包裹。

#3


引用 2 楼 fangmingshijie 的回复:
用<![CDATA[""]]>包裹。

亲,能具体说一下么,我是新手,谢了

#4


<MSGCONTENT><![CDATA[:- < & ]></MSGCONTENT>

#5


需要你的XML是一个合法的XML。
如果特殊字符没有escaped,那么就应该放在CDATA里,如楼上

#6


用正确的XML格式去封装

#7


把可能出现特殊字符的地方加上<![CDATA[  你的字符串  ]]>
"<MSGCONTENT><![CDATA[" + 你的字符串  +" ]]></MSGCONTENT>" 

#8


CDATA +1

#9


按楼上的,试试。 

#10


引用 7 楼 hunanlzg 的回复:
把可能出现特殊字符的地方加上<![CDATA[  你的字符串  ]]>
"<MSGCONTENT><![CDATA[" + 你的字符串  +" ]]></MSGCONTENT>" 

xml是接口方封装好的 我只能读取到byte[]数组啊

#11


还有人在么?大神在哪里

#12


楼上都说明白了,用<![CDATA[" + ":- < & "  + " ]]>包含可能出问题的字符
改为下面的代码,楼主再试试

String message = "<?xml version='1.0' encoding='UTF-8'?>" +
                "<SMSMSGRECEIVES>" +
                "<SMSMSGRECEIVE>" +
                "<MSGID>2014062940010629110513337600</MSGID>" +
                "<DESTTERMID>12345</DESTTERMID>" +
                "<SRCTERMID>13301639266</SRCTERMID>" +
                "<MSGCONTENT><![CDATA[" + ":- < & "  + " ]]></MSGCONTENT>" + 
                "<RECVTIME>2014-06-29 11:05:14</RECVTIME>" +
                "</SMSMSGRECEIVE>" +
                "<SMSMSGRECEIVE>"+
                "<MSGID>2014062940010629105000767600</MSGID>"+
                "<DESTTERMID>12345</DESTTERMID>"+
                "<SRCTERMID>13301639266</SRCTERMID>"+
                "<MSGCONTENT> ?行情波段定,不固定。</MSGCONTENT>"+
                "<RECVTIME>2014-06-29 10:50:02</RECVTIME>"+
                "</SMSMSGRECEIVE>"+
                "</SMSMSGRECEIVES>";

#13


引用 12 楼 magi1201 的回复:
楼上都说明白了,用<![CDATA[" + ":- < & "  + " ]]>包含可能出问题的字符
改为下面的代码,楼主再试试

String message = "<?xml version='1.0' encoding='UTF-8'?>" +
                "<SMSMSGRECEIVES>" +
                "<SMSMSGRECEIVE>" +
                "<MSGID>2014062940010629110513337600</MSGID>" +
                "<DESTTERMID>12345</DESTTERMID>" +
                "<SRCTERMID>13301639266</SRCTERMID>" +
                "<MSGCONTENT><![CDATA[" + ":- < & "  + " ]]></MSGCONTENT>" + 
                "<RECVTIME>2014-06-29 11:05:14</RECVTIME>" +
                "</SMSMSGRECEIVE>" +
                "<SMSMSGRECEIVE>"+
                "<MSGID>2014062940010629105000767600</MSGID>"+
                "<DESTTERMID>12345</DESTTERMID>"+
                "<SRCTERMID>13301639266</SRCTERMID>"+
                "<MSGCONTENT> ?行情波段定,不固定。</MSGCONTENT>"+
                "<RECVTIME>2014-06-29 10:50:02</RECVTIME>"+
                "</SMSMSGRECEIVE>"+
                "</SMSMSGRECEIVES>";

xml是接口方返回的,我没有办法更改,这个只是我写的测试类

#14


引用 13 楼 ch_xiaoc 的回复:
xml是接口方返回的,我没有办法更改,这个只是我写的测试类

先将给定的xml字符串message转为CDATA格式,然后再获取document格式

CDATA cdata = DocumentHelper.createCDATA(message);
Document document = cdata.getDocument();

楼主试试看

#15


1.使用<![CDATA[  ]]>包含。
2.也可以使用字符"<" 转换成实体,象下面:<message>if salary &lt; 1000 then</message>
&lt;  <  小于号
&gt;  >  大于号
&amp;  &  和

#16


引用 14 楼 magi1201 的回复:
Quote: 引用 13 楼 ch_xiaoc 的回复:

xml是接口方返回的,我没有办法更改,这个只是我写的测试类

先将给定的xml字符串message转为CDATA格式,然后再获取document格式

CDATA cdata = DocumentHelper.createCDATA(message);
Document document = cdata.getDocument();

楼主试试看


try {
CDATA cdata = DocumentHelper.createCDATA(message);
Document document = cdata.getDocument(); 


//Document document = DocumentHelper.parseText(message);
//document = DocumentHelper.parseText(message);
List<Element> elements = document.getRootElement().elements(
Constants.ELEMENT_NAME_SMSMSGRECEIVE);
for (Element element : elements) {
System.out.println(element.elementText(Constants.ELEMENT_NAME_MSGID));
System.out.println(element.elementText(Constants.ELEMENT_NAME_DESTTERMID));
System.out.println(element.elementText(Constants.ELEMENT_NAME_SRCTERMID));
System.out.println(element.elementText(Constants.ELEMENT_NAME_MSGCONTENT));
System.out.println(element.elementText(Constants.ELEMENT_NAME_RECVTIME));
}

} catch (Exception e) {
System.out.println("come on");
e.printStackTrace();
}

报了个空引用异常

#17


具体哪一行报错?看下是哪个元素值为空了
还有你的Constants.ELEMENT_NAME_SMSMSGRECEIVE 类似的这些常量值分别为多少?发出来我也来测试下

#18


引用 15 楼 jty1046550887 的回复:
1.使用<![CDATA[  ]]>包含。
2.也可以使用字符"<" 转换成实体,象下面:<message>if salary &lt; 1000 then</message>
&lt;  <  小于号
&gt;  >  大于号
&amp;  &  和

"<MSGCONTENT></MSGCONTENT>" 中内容为客户放过来的短信,内容什么都有可能。
xml文件是接口方返回的,文件已经没有办法更改了,只能读取过程中处理这些情况

#19


引用 17 楼 magi1201 的回复:
具体哪一行报错?看下是哪个元素值为空了
还有你的Constants.ELEMENT_NAME_SMSMSGRECEIVE 类似的这些常量值分别为多少?发出来我也来测试下


package com.clinet;

import java.util.List;

import org.dom4j.CDATA;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import com.clinet.base.Constants;


public class Test {

/**
 * @param args
 */
char [] chars = {0x0, 0x1, 0x2, 0x3, 0x4, 0x5};
private String filterText(String message) {
for (int i = 0; i < chars.length; i++) {
message = message.replaceAll(String.valueOf(chars[i]), "");
}
return message;
}
public static void main(String[] args) {
String message = "<?xml version='1.0' encoding='UTF-8'?>" +
"<SMSMSGRECEIVES>" +
"<SMSMSGRECEIVE>" +
"<MSGID>2014062940010629110513337600</MSGID>" +
"<DESTTERMID>12345</DESTTERMID>" +
"<SRCTERMID>13301639266</SRCTERMID>" +
"<MSGCONTENT>:-<  </MSGCONTENT>" +
"<RECVTIME>2014-06-29 11:05:14</RECVTIME>" +
"</SMSMSGRECEIVE>" +
"<SMSMSGRECEIVE>"+
"<MSGID>2014062940010629105000767600</MSGID>"+
    "<DESTTERMID>12345</DESTTERMID>"+
    "<SRCTERMID>13301639266</SRCTERMID>"+
    "<MSGCONTENT> ?行情波段定,不固定。</MSGCONTENT>"+
    "<RECVTIME>2014-06-29 10:50:02</RECVTIME>"+
    "</SMSMSGRECEIVE>"+
"</SMSMSGRECEIVES>";
Test t = new Test();
message = t.filterText(message);
System.out.println(message);
try {
CDATA cdata = DocumentHelper.createCDATA(message);
Document document = cdata.getDocument(); 


//Document document = DocumentHelper.parseText(message);
//document = DocumentHelper.parseText(message);
List<Element> elements = document.getRootElement().elements(
Constants.ELEMENT_NAME_SMSMSGRECEIVE);
for (Element element : elements) {
System.out.println(element.elementText(Constants.ELEMENT_NAME_MSGID));
System.out.println(element.elementText(Constants.ELEMENT_NAME_DESTTERMID));
System.out.println(element.elementText(Constants.ELEMENT_NAME_SRCTERMID));
System.out.println(element.elementText(Constants.ELEMENT_NAME_MSGCONTENT));
System.out.println(element.elementText(Constants.ELEMENT_NAME_RECVTIME));
}

} catch (Exception e) {
System.out.println("come on");
e.printStackTrace();
}
}
}

#20



package com.clinet.base;

public class Constants {
public static final String ELEMENT_NAME_SMSMSGRECEIVE = "SMSMSGRECEIVE";
public static final String ELEMENT_NAME_MSGID = "MSGID";
public static final String ELEMENT_NAME_DESTTERMID = "DESTTERMID";
public static final String ELEMENT_NAME_SRCTERMID = "SRCTERMID";
public static final String ELEMENT_NAME_MSGCONTENT = "MSGCONTENT";
public static final String ELEMENT_NAME_RECVTIME = "RECVTIME";
}

#21


让你们领导去找接口的提供者,这明显是你得到的数据不合法引起的

如果行政上无法解决,只好建议你用字符串解析的方式,一个节点一个节点地找并且分析了,比如找到
<SMSMSGRECEIVE>和</SMSMSGRECEIVE>的起始索引,然后得到这中间的字符串内容,再用 CDATA 的格式进行再组装,重新创建一个合法的 xml

#22


又来学习了。以前也不知道这个是怎么处理的。

#23


感觉这个得找数据提供者,让他们处理方便些,把严格禁止的字符按照它们预定义的实体
"<" 字符和"&"字符对于XML来说是严格禁止使用的

#24


引用 18 楼 ch_xiaoc 的回复:
Quote: 引用 15 楼 jty1046550887 的回复:

1.使用<![CDATA[  ]]>包含。
2.也可以使用字符"<" 转换成实体,象下面:<message>if salary &lt; 1000 then</message>
&lt;  <  小于号
&gt;  >  大于号
&amp;  &  和

"<MSGCONTENT></MSGCONTENT>" 中内容为客户放过来的短信,内容什么都有可能。
xml文件是接口方返回的,文件已经没有办法更改了,只能读取过程中处理这些情况
那就没办法了,根本不是标准的xml文件根本无法用dom4j解析。你应该找真正的大神,根据xml结构,自己写解析方法解析。

#25


放在<![CDATA[""]]>里面

#26


建议阅读W3C中关于XML标准的内容

#27


&用&amp;替代

#1



包含"&"运行抛错:
[code=java]
<?xml version='1.0' encoding='UTF-8'?><SMSMSGRECEIVES><SMSMSGRECEIVE><MSGID>2014062940010629110513337600</MSGID><DESTTERMID>12345</DESTTERMID><SRCTERMID>13301639266</SRCTERMID><MSGCONTENT>:- &  </MSGCONTENT><RECVTIME>2014-06-29 11:05:14</RECVTIME></SMSMSGRECEIVE><SMSMSGRECEIVE><MSGID>2014062940010629105000767600</MSGID><DESTTERMID>12345</DESTTERMID><SRCTERMID>13301639266</SRCTERMID><MSGCONTENT> ?行情波段定,不固定。</MSGCONTENT><RECVTIME>2014-06-29 10:50:02</RECVTIME></SMSMSGRECEIVE></SMSMSGRECEIVES>
come on
org.dom4j.DocumentException: Error on line 1 of document  : The entity name must immediately follow the '&' in the entity reference. Nested exception: The entity name must immediately follow the '&' in the entity reference.
at org.dom4j.io.SAXReader.read(SAXReader.java:350)
at org.dom4j.DocumentHelper.parseText(DocumentHelper.java:216)
at com.clinet.Test.main(Test.java:41)
Nested exception: 
org.xml.sax.SAXParseException: The entity name must immediately follow the '&' in the entity reference.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:174)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:388)
at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1427)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEntityReference(XMLDocumentFragmentScannerImpl.java:1846)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3033)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:647)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
at org.dom4j.io.SAXReader.read(SAXReader.java:334)
at org.dom4j.DocumentHelper.parseText(DocumentHelper.java:216)
at com.clinet.Test.main(Test.java:41)
Nested exception: org.xml.sax.SAXParseException: The entity name must immediately follow the '&' in the entity reference.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:174)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:388)
at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1427)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEntityReference(XMLDocumentFragmentScannerImpl.java:1846)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3033)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:647)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
at org.dom4j.io.SAXReader.read(SAXReader.java:334)
at org.dom4j.DocumentHelper.parseText(DocumentHelper.java:216)
at com.clinet.Test.main(Test.java:41)


[/code]

#2


用<![CDATA[""]]>包裹。

#3


引用 2 楼 fangmingshijie 的回复:
用<![CDATA[""]]>包裹。

亲,能具体说一下么,我是新手,谢了

#4


<MSGCONTENT><![CDATA[:- < & ]></MSGCONTENT>

#5


需要你的XML是一个合法的XML。
如果特殊字符没有escaped,那么就应该放在CDATA里,如楼上

#6


用正确的XML格式去封装

#7


把可能出现特殊字符的地方加上<![CDATA[  你的字符串  ]]>
"<MSGCONTENT><![CDATA[" + 你的字符串  +" ]]></MSGCONTENT>" 

#8


CDATA +1

#9


按楼上的,试试。 

#10


引用 7 楼 hunanlzg 的回复:
把可能出现特殊字符的地方加上<![CDATA[  你的字符串  ]]>
"<MSGCONTENT><![CDATA[" + 你的字符串  +" ]]></MSGCONTENT>" 

xml是接口方封装好的 我只能读取到byte[]数组啊

#11


还有人在么?大神在哪里

#12


楼上都说明白了,用<![CDATA[" + ":- < & "  + " ]]>包含可能出问题的字符
改为下面的代码,楼主再试试

String message = "<?xml version='1.0' encoding='UTF-8'?>" +
                "<SMSMSGRECEIVES>" +
                "<SMSMSGRECEIVE>" +
                "<MSGID>2014062940010629110513337600</MSGID>" +
                "<DESTTERMID>12345</DESTTERMID>" +
                "<SRCTERMID>13301639266</SRCTERMID>" +
                "<MSGCONTENT><![CDATA[" + ":- < & "  + " ]]></MSGCONTENT>" + 
                "<RECVTIME>2014-06-29 11:05:14</RECVTIME>" +
                "</SMSMSGRECEIVE>" +
                "<SMSMSGRECEIVE>"+
                "<MSGID>2014062940010629105000767600</MSGID>"+
                "<DESTTERMID>12345</DESTTERMID>"+
                "<SRCTERMID>13301639266</SRCTERMID>"+
                "<MSGCONTENT> ?行情波段定,不固定。</MSGCONTENT>"+
                "<RECVTIME>2014-06-29 10:50:02</RECVTIME>"+
                "</SMSMSGRECEIVE>"+
                "</SMSMSGRECEIVES>";

#13


引用 12 楼 magi1201 的回复:
楼上都说明白了,用<![CDATA[" + ":- < & "  + " ]]>包含可能出问题的字符
改为下面的代码,楼主再试试

String message = "<?xml version='1.0' encoding='UTF-8'?>" +
                "<SMSMSGRECEIVES>" +
                "<SMSMSGRECEIVE>" +
                "<MSGID>2014062940010629110513337600</MSGID>" +
                "<DESTTERMID>12345</DESTTERMID>" +
                "<SRCTERMID>13301639266</SRCTERMID>" +
                "<MSGCONTENT><![CDATA[" + ":- < & "  + " ]]></MSGCONTENT>" + 
                "<RECVTIME>2014-06-29 11:05:14</RECVTIME>" +
                "</SMSMSGRECEIVE>" +
                "<SMSMSGRECEIVE>"+
                "<MSGID>2014062940010629105000767600</MSGID>"+
                "<DESTTERMID>12345</DESTTERMID>"+
                "<SRCTERMID>13301639266</SRCTERMID>"+
                "<MSGCONTENT> ?行情波段定,不固定。</MSGCONTENT>"+
                "<RECVTIME>2014-06-29 10:50:02</RECVTIME>"+
                "</SMSMSGRECEIVE>"+
                "</SMSMSGRECEIVES>";

xml是接口方返回的,我没有办法更改,这个只是我写的测试类

#14


引用 13 楼 ch_xiaoc 的回复:
xml是接口方返回的,我没有办法更改,这个只是我写的测试类

先将给定的xml字符串message转为CDATA格式,然后再获取document格式

CDATA cdata = DocumentHelper.createCDATA(message);
Document document = cdata.getDocument();

楼主试试看

#15


1.使用<![CDATA[  ]]>包含。
2.也可以使用字符"<" 转换成实体,象下面:<message>if salary &lt; 1000 then</message>
&lt;  <  小于号
&gt;  >  大于号
&amp;  &  和

#16


引用 14 楼 magi1201 的回复:
Quote: 引用 13 楼 ch_xiaoc 的回复:

xml是接口方返回的,我没有办法更改,这个只是我写的测试类

先将给定的xml字符串message转为CDATA格式,然后再获取document格式

CDATA cdata = DocumentHelper.createCDATA(message);
Document document = cdata.getDocument();

楼主试试看


try {
CDATA cdata = DocumentHelper.createCDATA(message);
Document document = cdata.getDocument(); 


//Document document = DocumentHelper.parseText(message);
//document = DocumentHelper.parseText(message);
List<Element> elements = document.getRootElement().elements(
Constants.ELEMENT_NAME_SMSMSGRECEIVE);
for (Element element : elements) {
System.out.println(element.elementText(Constants.ELEMENT_NAME_MSGID));
System.out.println(element.elementText(Constants.ELEMENT_NAME_DESTTERMID));
System.out.println(element.elementText(Constants.ELEMENT_NAME_SRCTERMID));
System.out.println(element.elementText(Constants.ELEMENT_NAME_MSGCONTENT));
System.out.println(element.elementText(Constants.ELEMENT_NAME_RECVTIME));
}

} catch (Exception e) {
System.out.println("come on");
e.printStackTrace();
}

报了个空引用异常

#17


具体哪一行报错?看下是哪个元素值为空了
还有你的Constants.ELEMENT_NAME_SMSMSGRECEIVE 类似的这些常量值分别为多少?发出来我也来测试下

#18


引用 15 楼 jty1046550887 的回复:
1.使用<![CDATA[  ]]>包含。
2.也可以使用字符"<" 转换成实体,象下面:<message>if salary &lt; 1000 then</message>
&lt;  <  小于号
&gt;  >  大于号
&amp;  &  和

"<MSGCONTENT></MSGCONTENT>" 中内容为客户放过来的短信,内容什么都有可能。
xml文件是接口方返回的,文件已经没有办法更改了,只能读取过程中处理这些情况

#19


引用 17 楼 magi1201 的回复:
具体哪一行报错?看下是哪个元素值为空了
还有你的Constants.ELEMENT_NAME_SMSMSGRECEIVE 类似的这些常量值分别为多少?发出来我也来测试下


package com.clinet;

import java.util.List;

import org.dom4j.CDATA;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import com.clinet.base.Constants;


public class Test {

/**
 * @param args
 */
char [] chars = {0x0, 0x1, 0x2, 0x3, 0x4, 0x5};
private String filterText(String message) {
for (int i = 0; i < chars.length; i++) {
message = message.replaceAll(String.valueOf(chars[i]), "");
}
return message;
}
public static void main(String[] args) {
String message = "<?xml version='1.0' encoding='UTF-8'?>" +
"<SMSMSGRECEIVES>" +
"<SMSMSGRECEIVE>" +
"<MSGID>2014062940010629110513337600</MSGID>" +
"<DESTTERMID>12345</DESTTERMID>" +
"<SRCTERMID>13301639266</SRCTERMID>" +
"<MSGCONTENT>:-<  </MSGCONTENT>" +
"<RECVTIME>2014-06-29 11:05:14</RECVTIME>" +
"</SMSMSGRECEIVE>" +
"<SMSMSGRECEIVE>"+
"<MSGID>2014062940010629105000767600</MSGID>"+
    "<DESTTERMID>12345</DESTTERMID>"+
    "<SRCTERMID>13301639266</SRCTERMID>"+
    "<MSGCONTENT> ?行情波段定,不固定。</MSGCONTENT>"+
    "<RECVTIME>2014-06-29 10:50:02</RECVTIME>"+
    "</SMSMSGRECEIVE>"+
"</SMSMSGRECEIVES>";
Test t = new Test();
message = t.filterText(message);
System.out.println(message);
try {
CDATA cdata = DocumentHelper.createCDATA(message);
Document document = cdata.getDocument(); 


//Document document = DocumentHelper.parseText(message);
//document = DocumentHelper.parseText(message);
List<Element> elements = document.getRootElement().elements(
Constants.ELEMENT_NAME_SMSMSGRECEIVE);
for (Element element : elements) {
System.out.println(element.elementText(Constants.ELEMENT_NAME_MSGID));
System.out.println(element.elementText(Constants.ELEMENT_NAME_DESTTERMID));
System.out.println(element.elementText(Constants.ELEMENT_NAME_SRCTERMID));
System.out.println(element.elementText(Constants.ELEMENT_NAME_MSGCONTENT));
System.out.println(element.elementText(Constants.ELEMENT_NAME_RECVTIME));
}

} catch (Exception e) {
System.out.println("come on");
e.printStackTrace();
}
}
}

#20



package com.clinet.base;

public class Constants {
public static final String ELEMENT_NAME_SMSMSGRECEIVE = "SMSMSGRECEIVE";
public static final String ELEMENT_NAME_MSGID = "MSGID";
public static final String ELEMENT_NAME_DESTTERMID = "DESTTERMID";
public static final String ELEMENT_NAME_SRCTERMID = "SRCTERMID";
public static final String ELEMENT_NAME_MSGCONTENT = "MSGCONTENT";
public static final String ELEMENT_NAME_RECVTIME = "RECVTIME";
}

#21


让你们领导去找接口的提供者,这明显是你得到的数据不合法引起的

如果行政上无法解决,只好建议你用字符串解析的方式,一个节点一个节点地找并且分析了,比如找到
<SMSMSGRECEIVE>和</SMSMSGRECEIVE>的起始索引,然后得到这中间的字符串内容,再用 CDATA 的格式进行再组装,重新创建一个合法的 xml

#22


又来学习了。以前也不知道这个是怎么处理的。

#23


感觉这个得找数据提供者,让他们处理方便些,把严格禁止的字符按照它们预定义的实体
"<" 字符和"&"字符对于XML来说是严格禁止使用的

#24


引用 18 楼 ch_xiaoc 的回复:
Quote: 引用 15 楼 jty1046550887 的回复:

1.使用<![CDATA[  ]]>包含。
2.也可以使用字符"<" 转换成实体,象下面:<message>if salary &lt; 1000 then</message>
&lt;  <  小于号
&gt;  >  大于号
&amp;  &  和

"<MSGCONTENT></MSGCONTENT>" 中内容为客户放过来的短信,内容什么都有可能。
xml文件是接口方返回的,文件已经没有办法更改了,只能读取过程中处理这些情况
那就没办法了,根本不是标准的xml文件根本无法用dom4j解析。你应该找真正的大神,根据xml结构,自己写解析方法解析。

#25


放在<![CDATA[""]]>里面

#26


建议阅读W3C中关于XML标准的内容

#27


&用&amp;替代