【问题标题】:XPath string as inputXPath 字符串作为输入
【发布时间】:2014-04-04 18:47:51
【问题描述】:

考虑下面的代码示例,

if 'xpath' in request.args:
    in = request.args['xpath']
    xml = BytesIO(open("/file.xml").read())
    for v, e in etree.iterparse(xml):
         return e.text

以下 XML 文件,

<a>
   <c>
      <d>content X</d>
   </c>
   <c>
      <d>content Y</d>
   </c>
</a>

in 变量接收带有 curl 的字符串 /a/c[2]/d,如下所示

curl http://localhost:5000/home?xpath=/a/c[2]/d

有没有什么方法可以从给定的字符串(xpath 表达式)中返回元素文本(即能够理解我指的是哪个元素)?

【问题讨论】:

  • 我不明白你的要求。你期望输出什么? XPath 正是为了引用 XML 中的元素而设计的,这就是该语言的全部目的......

标签: python xml xpath flask lxml


【解决方案1】:

要返回in定位的元素,可以在解析后的ElementTree上调用find方法。

return etree.parse(xml).find(in).text

请注意,XPath 表达式不能包含根元素本身,也不能包含斜杠,所以c[2]/d 应该可以解决问题。

【讨论】:

  • 您的意思是我必须解析 xml 文件以制作类似于here 中描述的内容? @Valéry
  • 为什么 XPath 表达式不应该包含根元素? @Valéry
  • 它返回 AttributeError: 'NoneType' object has no attribute 'text' 但我想使用来自根的表达式,如 /a/c/d 有什么办法可以这样工作吗?跨度>
  • find 相对于根元素起作用,因此它看不到它。您可以删除表达式的开头直到第二个/(或者可能在前面添加..)。
  • 好的。但是如果我仍然想使用整个路径怎么办? (即 /a/c/d)因为这是我在 URL 中输入的内容(例如 ip:5000/link?xpath=/a/c/d)@Valéry
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2020-01-12
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
相关资源
最近更新 更多