【问题标题】:How to use Elementree XML parsing from string in server side?如何在服务器端使用 Elementree XML 解析字符串?
【发布时间】:2020-10-05 18:27:29
【问题描述】:

我一直在尝试通过套接字从客户端向服务器发送 xml 字符串。思路是用ElementTree解析这个xml,然后使用得到的元素。

我可以成功地将字符串从客户端传递到服务器,但是无论我如何在客户端中构建 xml(通过文件、三引号字符串或使用 ElementTree 包中的方法),在服务器中我不断收到错误

xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 1, column 0

我已经验证了文件/字符串,但我不确定错误在哪里,因为我真的没有任何直接使用 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 的库,但我不允许使用它。

【问题讨论】:

  • 在尝试将其解析为 XML 之前打印 msg 会得到什么?
  • 这是打印出来的msg&lt;?xml version="1.0"?&gt; &lt;methodCall&gt; &lt;methodName&gt;somemethodname&lt;/methodName&gt; &lt;params&gt; &lt;param&gt; &lt;value&gt;&lt;string&gt;somevalue&lt;/string&gt;&lt;/value&gt; &lt;/param&gt; &lt;param&gt; &lt;value&gt;&lt;i4&gt;1&lt;/i4&gt;&lt;/value&gt; &lt;/param&gt; &lt;param&gt; &lt;value&gt;&lt;string&gt;anothervalue&lt;/string&gt;&lt;/value&gt; &lt;/param&gt; &lt;/params&gt; &lt;/methodCall&gt;
  • 您的msg 是有效的xml,ET 和lxml 都可以正常读取。

标签: python-3.x xml sockets elementtree


【解决方案1】:

试试这个。

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()'))

【讨论】:

    【解决方案2】:

    这与其说是一个错误,不如说是一个答案,因为我没有注意到它实际上从一开始就起作用了。

    问题是客户端正在发送 2 条消息

    send(xmldata)
    send(DisconnectMsg)
    

    即使 ElementTree 正确解析了第一条消息,也会弹出第二条消息的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-08
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多