0

我一直在左右寻找答案。即使stackoverflow也只有1个类似的问题,但答案在我的情况下不起作用。我无法验证 xml 并不断收到此错误:

“无法选择用于解码数据的元素,请提供有效的‘路径’参数。”

我的目标是通过验证将 json 数据转换为 xml。有人有什么想法吗?

下面是我的简单代码:

import xmlschema
import json
from xml.etree import ElementTree

my_xsd = '<?xml version="1.0"?><schema targetNamespace = "urn:oasis:names:tc:emergency:cap:1.2" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <element name="note" type="xs:string"/><element name="age" type="xs:integer"/> </schema>'

schema = xmlschema.XMLSchema(my_xsd)
#jdata = xmlschema.to_json(xml_document = """<note>this is a Note text</note>""", schema = schema)
#jsonData = json.dumps(jdata)
data = json.dumps({'note': 'this is a Note text','age':'5'})

#print (jdata)
#print (jsonData)
print(data)
xml = xmlschema.from_json(data, schema=schema)

ElementTree.dump(xml)
4

2 回答 2

0

我向 xmlschema 创建者请求帮助,结果发现我需要额外的参数:from_json(jsonTxt,schema = CAPSchema, preserve_root=True, namespaces={'': 'urn:oasis:names:tc:emergency:cap:1.2 '})

于 2021-04-15T16:58:15.590 回答
0

xsd 中没有错误。这是一个简化版本(我取出了 json 处理以了解文档是否有效)。

下面可以在不使用json的情况下解码xml文档:

import xmlschema
import datetime
import xml.etree.ElementTree as ET

CAPSchema=xmlschema.XMLSchema('https://docs.oasis-open.org/emergency/cap/v1.2/CAP-v1.2.xsd')
xmldoc="""<?xml version = "1.0" encoding = "UTF-8"?><alert xmlns = "urn:oasis:names:tc:emergency:cap:1.2"><identifier>43b080713727</identifier>
<sender>hsas@dhs.gov</sender><sent>2003-04-02T14:39:01-05:00</sent><status>Actual</status><msgType>Alert</msgType><scope>Public</scope>  
<info><category>Security</category><event>Homeland Security Advisory System Update</event><urgency>Immediate</urgency><severity>Severe</severity>   
<certainty>Likely</certainty><senderName>U.S. Government, Department of Homeland Security</senderName><headline>Homeland Security Sets Code ORANGE</headline>
<description>The Department of Homeland Security has elevated the Homeland Security Advisory.</description>
<instruction> A High Condition is declared when there is a high risk of terrorist attacks.</instruction><web>http://www.dhs.gov/dhspublic/display?theme=29</web>
<parameter><valueName>HSAS</valueName><value>ORANGE</value></parameter><resource><resourceDesc>Image file (GIF)</resourceDesc>
<mimeType>image/gif</mimeType><uri>http://www.dhs.gov/dhspublic/getAdvisoryImage</uri></resource><area><areaDesc>U.S. nationwide and interests worldwide</areaDesc></area></info></alert>"""

decoded_xml = CAPSchema.to_dict(xmldoc,"/alert")
print(decoded_xml)

##just showing you can pretty print
pprint(CAPSchema.to_dict(xmldoc))

在上述基础上,您可以使用以下方法将其转换为 json xmlschema.to_json()

import json
xml_as_json = xmlschema.to_json(xmldoc,schema=CAPSchema,converter = xmlschema.ParkerConverter)

这是我从上面打印出 xml_as_json 的输出:

print(xml_as_json)
{"identifier": "43b080713727", "sender": "hsas@dhs.gov", "sent": "2003-04-02T14:39:01-05:00", "status": "Actual", "msgType": "Alert", "scope": "Public", "info": {"category": "Security", "event": "Homeland Security Advisory System Update", "urgency": "Immediate", "severity": "Severe", "certainty": "Likely", "senderName": "U.S. Government, Department of Homeland Security", "headline": "Homeland Security Sets Code ORANGE", "description": "The Department of Homeland Security has elevated the Homeland Security Advisory.", "instruction": " A High Condition is declared when there is a high risk of terrorist attacks.", "web": "http://www.dhs.gov/dhspublic/display?theme=29", "parameter": {"valueName": "HSAS", "value": "ORANGE"}, "resource": {"resourceDesc": "Image file (GIF)", "mimeType": "image/gif", "uri": "http://www.dhs.gov/dhspublic/getAdvisoryImage"}, "area": {"areaDesc": "U.S. nationwide and interests worldwide"}}}
于 2021-04-09T20:49:38.450 回答