如何在服务器端使用 Elementree XML 从字符串解析?
How to use Elementree XML parsing from string in server side?
我一直在尝试通过套接字从客户端向服务器发送 xml 字符串。思路是用ElementTree解析这个xml,然后使用得到的元素
我可以成功地将字符串从客户端传递到服务器,但无论我如何在客户端中构建 xml(通过文件、三重引号字符串或使用 ElementTree 包中的方法),在服务器我一直收到错误
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 1, column 0
我已经验证了 file/string 但我不确定哪里出了问题,因为我真的没有任何直接使用 XML 文件的经验。
这是 XML 字符串
RemoteFunction = '''<?xml version="1.0"?>
<methodCall>
<methodName>somemethodname</methodName>
<params>
<param>
<value><string>somevalue</string></value>
</param>
<param>
<value><i4>1</i4></value>
</param>
<param>
<value><string>anothervalue</string></value>
</param>
</params>
</methodCall>'''
这是服务器中的连接处理函数
import xml.etree.ElementTree as ET
def client_handler( connection, address):
connected = True
while connected:
msgLen = connection.recv(64).decode("utf-8")
if msgLen:
msgLen = int(msgLen)
msg = connection.recv(msgLen).decode("utf-8")
if msg == "!Disconnect":
connected = False
tree = ET.fromstring(msg)
注意:我知道 Python3 中有一个用于 XMLRPC 的库,但不允许我使用它。
这与其说是一个错误,不如说是一个答案,因为我没有注意到它实际上从一开始就在工作。
问题是客户端发送了 2 条消息
send(xmldata)
send(DisconnectMsg)
即使 ElementTree 正确解析了第一条消息,第二条消息也会弹出错误。
试试这个。
from simplified_scrapy import SimplifiedDoc
def client_handler( connection, address):
connected = True
while connected:
msgLen = connection.recv(64).decode("utf-8")
if msgLen:
msgLen = int(msgLen)
msg = connection.recv(msgLen).decode("utf-8")
if msg == "!Disconnect":
connected = False
doc = SimplifiedDoc(msg)
print (doc.methodName.text, doc.selects('param>text()'))
我一直在尝试通过套接字从客户端向服务器发送 xml 字符串。思路是用ElementTree解析这个xml,然后使用得到的元素
我可以成功地将字符串从客户端传递到服务器,但无论我如何在客户端中构建 xml(通过文件、三重引号字符串或使用 ElementTree 包中的方法),在服务器我一直收到错误
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 1, column 0
我已经验证了 file/string 但我不确定哪里出了问题,因为我真的没有任何直接使用 XML 文件的经验。
这是 XML 字符串
RemoteFunction = '''<?xml version="1.0"?>
<methodCall>
<methodName>somemethodname</methodName>
<params>
<param>
<value><string>somevalue</string></value>
</param>
<param>
<value><i4>1</i4></value>
</param>
<param>
<value><string>anothervalue</string></value>
</param>
</params>
</methodCall>'''
这是服务器中的连接处理函数
import xml.etree.ElementTree as ET
def client_handler( connection, address):
connected = True
while connected:
msgLen = connection.recv(64).decode("utf-8")
if msgLen:
msgLen = int(msgLen)
msg = connection.recv(msgLen).decode("utf-8")
if msg == "!Disconnect":
connected = False
tree = ET.fromstring(msg)
注意:我知道 Python3 中有一个用于 XMLRPC 的库,但不允许我使用它。
这与其说是一个错误,不如说是一个答案,因为我没有注意到它实际上从一开始就在工作。
问题是客户端发送了 2 条消息
send(xmldata)
send(DisconnectMsg)
即使 ElementTree 正确解析了第一条消息,第二条消息也会弹出错误。
试试这个。
from simplified_scrapy import SimplifiedDoc
def client_handler( connection, address):
connected = True
while connected:
msgLen = connection.recv(64).decode("utf-8")
if msgLen:
msgLen = int(msgLen)
msg = connection.recv(msgLen).decode("utf-8")
if msg == "!Disconnect":
connected = False
doc = SimplifiedDoc(msg)
print (doc.methodName.text, doc.selects('param>text()'))