我有以下格式的XSD文件:
<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:type name="type1">
<xsd:example>
<xsd:description>This is the description of said type1 tag</xsd:description>
</xsd:example>
</xsd:type>
<xsd:type name="type2">
<xsd:example>
<xsd:description>This is the description of said type2 tag</xsd:description>
</xsd:example>
</xsd:type>
<xsd:type name="type3">
<xsd:example>
<xsd:description>This is the description of said type3 tag</xsd:description>
</xsd:example>
</xsd:type>
</xsd:schema>
以及以下XML文件:
<theRoot>
<type1>hi from type1</type1>
<theChild>
<type2>hi from type2</type2>
<type3>hi from type3</type3>
</theChild>
</theRoot>
我想检索xsd:description标记之间的值,因为它是具有name =“ type1”属性的xsd:type标记的子代。换句话说,我想检索“这是所述type1标签的描述”。
我尝试通过以下方式使用Python使用lxml
来做到这一点:
from lxml import etree
XSDDoc = etree.parse(xsdFile)
root = XSDDoc.getroot()
result = root.findall(".//xsd:type/xsd:example/xsd:description[@name='type1']", root.nsmap)
我使用了与here相同的示例和解决方案。但是,我所做的只是返回空结果,而我无法检索正确的结果。
作为参考,我的Python版本是:Python 2.7.10
编辑: 当我通过从字符串中检索XML结构使用答案中提供的示例时,结果如预期的那样。但是,当我尝试从文件中检索时,会得到返回的空列表(或无)。
我正在执行以下操作:
代码在单独的XML文件中循环每个节点,然后检入XSD文件以获取每个属性,作为结果:
XMLDoc = etree.parse(open(xmlFile))
for Node in XMLDoc.xpath('//*'):
nameVariable = os.path.basename(XMLDoc.getpath(Node))
root = XSDDoc.getroot()
description = XSDDoc.find(".//xsd:type[@name='{0}']/xsd:example/xsd:description".format(nameVariable), root.nsmap)
如果我尝试打印出result.text
,则会得到:
AttributeError:'NoneType'对象没有属性'text'
答案 0 :(得分:1)
谓词(<resources>
<string name="app_name">Localization</string>
<string name="action_settings">Settings</string>
<string name="test_string">Ukrainian</string>
</resources>
)必须在正确的位置使用。 [@name='type1']
属性位于name
元素上。这应该起作用:
xsd:type
如果只需要一个节点,则可以使用result = root.findall(".//xsd:type[@name='type1']/xsd:example/xsd:description", root.nsmap)
# result is a list
for r in result:
print(r.text)
代替find
。完整示例:
findall