这是我的xml文件
<Item name="Date" xpath='p[@class="date"]/text()' defaultValue="Date Not Found"></Item>
我这样解析:
self.doc=etree.parse(xmlFile)
masterItemsFromXML = self.doc.findall('MasterPage/MasterItems/Item')
for oneItem in masterItemsFromXML:
print 'master item xpath = {0}'.format(oneItem.attrib['xpath'])
我可以看到cmd
中打印的结果:
master item xpath =p[@class="date"]/text()
xpath无效,因为它应以'开头,以'
结尾我试过这个
name="Date" xpath='''p[@class="date"]/text()'''
但是我在解析xml时出错了。
帮助
答案 0 :(得分:2)
在XML中,属性值始终使用单引号或双引号引用。有关详细信息,请参阅the spec。这些引号不是属性值的一部分。因此,正如所写,您的属性值为p[@class="date"]/text()
- 正是您从代码中获得的内容。
那么,如果你想在实际值中同时使用单引号和双引号怎么办?好吧,如果你单引号,它就不能有单引号;如果你加倍引用它,它内部就不能有双引号;并且没有其他选择。
Python有一个很好的解决方案,使文字的引号增加三倍,但这只是Python。其他语言有不同的解决方案,例如将文字中间的引号加倍,或使用反斜杠转义。
XML的含义是entity reference and character references。所以,这些都是你想要的:
<Item name="Date" xpath="'p[@class="date"]/text()'" defaultValue="Date Not Found"></Item>
<Item name="Date" xpath="'p[@class="date"]/text()'" defaultValue="Date Not Found"></Item>
<Item name="Date" xpath=''p[@class="date"]/text()'' defaultValue="Date Not Found"></Item>
<Item name="Date" xpath=''p[@class="date"]/text()'' defaultValue="Date Not Found"></Item>
现在您有一个正确引用的属性值,其中包含单引号。
所有这些,你确定你真的想要xpath
值中的那些单引号吗?毕竟,没有这些引号,它是一个有效的XPath表达式;和他们在一起,事实并非如此。如果你想做的就是打印有效的引号,而不是将它们嵌入到值中,那就更容易了:
print "master item xpath = '{0}'".format(oneItem.attrib['xpath'])
答案 1 :(得分:0)
使用元素:
<Item ...>
<xpath>p[@class="date"]/text()</xpath>
</Item>