XML 应该是严格的,因此 XML 中不允许使用一些 Unicode 字符。然而,我正在尝试使用通常包含这些字符的 RSS 提要,并且我希望避免无效字符的解析错误,或者从它们中优雅地恢复并无论如何呈现文档。
请参阅此处的示例(无论如何在 3 月 21 日):http://feeds.feedburner.com/chrisblattman
在 XML feed 中处理 unicode 的推荐方法是什么?检测字符并替换为空字节,编辑解析器,还是其他方法?
我试图在Android上解析带有SaxParser的xml文件.
这是我的xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<cars>
<car model="CitroenC3">
<maintenances>
<xm:maintenance xmlns:xm="it.a.b.android.c.car.m" distance="" price="">
<xm:type></xm:type>
</xm:maintenance>
</maintenances>
<chargings>
<xc:charging xmlns:xc="it.a.b.c.fuelconsumption.car.m" quantity="18" price="20" distance="400" consumption="14"/>
</chargings>
</car>
</cars>
Run Code Online (Sandbox Code Playgroud)
这是代码:
// Handling XML
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
XmlResourceParser parser = getResources().getXml(R.xml.data);
// Create handler to handle XML Tags ( extends DefaultHandler )
DataSaxHandler myXMLHandler = new DataSaxHandler();
xr.setContentHandler(myXMLHandler);
InputStream is= getResources().openRawResource(R.xml.data);
xr.parse(new InputSource(is));
Run Code Online (Sandbox Code Playgroud)
在xr.parse后我有异常:
03-22 15:24:04.248:INFO/System.out(415):XML Pasing Excpetion =
org.apache.harmony.xml.ExpatParser$ParseException: At line 1, column 0: …Run Code Online (Sandbox Code Playgroud) 我正在使用Expat和自定义C++包装器,我已经在其他项目上测试过.我遇到了问题,因为原始数据(c_str)没有以正确的方式转换为std :: string.这让我印象深刻,因为我没有改变包装器的来源.
看起来这个字符串在转换后得到以null结尾的字符:
onCharacterData( std::string( pszData, nLength ) ) // --> std::string( char* pszData)
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
// Wrapper defines the class Expat and implements for example:
void XMLCALL Expat::CharacterDataHandler( void *pUserData, const XML_Char *pszData,
int nLength )
{
Expat* pThis = static_cast<Expat*>( pUserData );
// XML_Char is char, therefore this call contains i.e.: std::string("hello", 5)
pThis->onCharacterData( std::string( pszData, nLength ) );
}
Run Code Online (Sandbox Code Playgroud)
// Parser is defined as: class Parser : Expat
void Parser::onCharacterData(const std::string& data )
{ …Run Code Online (Sandbox Code Playgroud) 在我的XML输入文件中,我有以下行:
<change beforeWhat="Literacy rate in L2: 50\%–75\%. Informally used" />
Run Code Online (Sandbox Code Playgroud)
在50\%和之间的那个字符75\%不是连字符而是短划线.
当我在Python中使用expat解析此XML文件时:
postFixesDoc = minidom.parse('postFixes.xml')
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
ExpatError: not well-formed (invalid token): line 35, column 99
Run Code Online (Sandbox Code Playgroud)
其中35是我在XML输入文件中引用的行,而99是%在en dash之前的右列.
如果我用短划线替换–,那么错误就会消失,一切正常.所以我有一个解决方法.但我不明白为什么会这样.
我读过的关于这个问题的内容 - 例如Python的minidom,xml和非法的unicode字符 - 告诉我,一些UTF-8中合法的字符在XML中是不合法的,并指出了XML的第2.2节法律字符范围的规范.但Char的定义包括范围#x20-#xD7FF.并且#x2013该范围内的明显下降.所以有什么问题?
FWIW,XML输入文件以UTF-8声明开头,
<?xml version="1.0" encoding="utf8"?>
Run Code Online (Sandbox Code Playgroud)
我使用十六进制编辑器来验证短划线由字符序列E2 80 93表示,这是用于短划线的正确UTF-8编码.那么为什么不会外籍人士接受呢?这是外籍人士的错误吗?
我无法在Mac OS X 10.7.2上构建libjingle.当我$path_to_swtoolkit/hammer.sh按照libjingle的自述文件运行时输出如下 .
MBP17:talk rei25$ ~/Desktop/swtoolkit/hammer.sh
scons: Reading SConscript files ...
scons: warning: The build_dir keyword has been deprecated; use the variant_dir keyword instead.
File "/Users/rei25/Desktop/swtoolkit/site_scons/site_init.py", line 203, in BuildEnvironmentSConscripts
scons: done reading SConscript files.
scons: Building targets ...
________Compiling build/dbg/obj/third_party/expat-2.0.1/lib/xmlparse.o
third_party/expat-2.0.1/lib/xmlparse.c:6:48: error: string.h: No such file or directory
third_party/expat-2.0.1/lib/xmlparse.c:7:20: error: assert.h: No such file or directory
In file included from third_party/expat-2.0.1/lib/xmlparse.c:24:
third_party/expat-2.0.1/lib/expat.h:17:20: error: stdlib.h: No such file or directory
cc1: warnings being treated as errors …Run Code Online (Sandbox Code Playgroud) 在python中使用expat xml解析器时,我怎样才能将解析后的xml数据存储在字符串或文件或任何数据结构中.请告诉我一种方法来完成如何解析和使用xml数据的节点.