从C#程序接收xml字符串无法用解析等fromstring在Python 3.5中

2024-05-18 23:27:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个C程序,它发送如下XML字符串:

<?xml version="1.0" encoding="utf-16" standalone="no"?>
<ScoreList>
  <Player UserName="Player1" Score="10" />
  <Player UserName="Player2" Score="20" />
</ScoreList>

但是当我在Python程序中收到它时

   b'<?xml version="1.0" encoding="utf-16" standalone="no"?>
   \r\n<ScoreList>\r\n  
   <Player UserName="Player1" Score="10" />
   \r\n  <Player UserName="Player2" Score="20" />
   \r\n</ScoreList>' 

我把它发送到一个服务器上,代码是C

Byte[] sendBytes = Encoding.BigEndianUnicode.GetBytes(doc);
        netStream.Write(sendBytes, 0, sendBytes.Length);

并在Python(版本3.5)端接收此代码

self.data = self.request.recv(1024).strip()

当我试图用这个代码解析它时

tree = ET.fromstring(self.data)

我得到一个错误:

 File "<string>", line None
 xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 1, 
 column 1

任何关于我哪里出了问题或者我可以尝试解决这个问题的建议。你知道吗


Tags: no代码self程序versionusernamexmlutf
1条回答
网友
1楼 · 发布于 2024-05-18 23:27:26

看起来好像是在代码的某个地方对str实例调用bytes。你知道吗

考虑以下xml片段:

>>> x = '<foo>Hello world</foo>'

如果它是通过网络发送的,则必须将其编码为字节。你知道吗

>>> bs = x.encode('utf-8')
>>> bs
b'<foo>Hello world</foo>'

ElementTree将按原样接受UTF-8编码的字节,或者您可以在将它们传递给ElementTree之前对它们进行解码:

>>> decoded = bs.decode('utf-8')
>>> decoded
'<foo>Hello world</foo>'

但是,如果对字节调用str,则会得到字节的repr,其中包括前导的b

>>> stringified = str(bs)
>>> stringified
"b'<foo>Hello world</foo>'"

ElementTree将不接受此输入:

>>> ET.fromstring(stringified)
Traceback (most recent call last):
  ...
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 1, column 1

要解决这个问题,您需要了解self.data是如何构造的。确保对接收的字节调用decode(),而不是str()。你知道吗

相关问题 更多 >

    热门问题