SO中文参考
首页
(current)
程序语言
c
java
python
c++
go
javascript
swift
c#
操作系统
linux
ubuntu
centos
unix
数据库
oracle
mysql
mongodb
postgresql
框架
node.js
angular
react-native
avalon
django
twisted
hadoop
.net
移动开发
android
ios
搜索
Python lxml - 使用 xml:lang 属性检索元素都铎王朝 <question vote="2"> <p>我有一些 xml,其中包含多个同名元素,但每个元素都采用不同的语言,例如:</p> <pre><code><Title xml:lang="FR" type="main">Les Tudors</Title> <Title xml:lang="DE" type="main">Die Tudors</Title> <Title xml:lang="IT" type="main">The Tudors</Title> </code></pre> <p>通常,我会使用其属性检索元素,如下所示:</p> <pre><code>titlex = info.find('.//xmlns:Title[@someattribute=attributevalue]', namespaces=nsmap) </code></pre> <p>如果我尝试使用 [@xml:lang="FR"] (例如)执行此操作,我会收到回溯错误:</p> <pre><code> File "D:/Python code/RBM CRID, Title, Genre/CRID, Title, Genre, Age rating, Episode Number, Descriptions V1.py", line 29, in <module> titlex = info.find('.//xmlns:Title[@xml:lang=PL]', namespaces=nsmap) File "lxml.etree.pyx", line 1457, in lxml.etree._Element.find (src\lxml\lxml.etree.c:51435) File "C:\Python34\lib\site-packages\lxml\_elementpath.py", line 282, in find it = iterfind(elem, path, namespaces) File "C:\Python34\lib\site-packages\lxml\_elementpath.py", line 272, in iterfind selector = _build_path_iterator(path, namespaces) File "C:\Python34\lib\site-packages\lxml\_elementpath.py", line 256, in _build_path_iterator selector.append(ops[token[0]](_next, token)) File "C:\Python34\lib\site-packages\lxml\_elementpath.py", line 134, in prepare_predicate token = next() File "C:\Python34\lib\site-packages\lxml\_elementpath.py", line 80, in xpath_tokenizer raise SyntaxError("prefix %r not found in prefix map" % prefix) SyntaxError: prefix 'xml' not found in prefix map </code></pre> <p>我对此并不感到惊讶,但我希望获得有关如何解决该问题的建议。</p> <p>谢谢!</p> <p>根据要求,一组精简但完整的代码(如果我删除[方括号中的位],它会按预期工作):</p> <pre><code>import lxml import codecs file_name = (input('Enter the file name, excluding .xml extension: ') + '.xml')# User inputs file name print('Parsing ' + file_name) #----- Sets up import and namespace from lxml import etree parser = lxml.etree.XMLParser() tree = lxml.etree.parse(file_name, parser) # Name of file to test goes here root = tree.getroot() nsmap = {'xmlns': 'urn:tva:metadata:2012', 'mpeg7': 'urn:tva:mpeg7:2008'} #----- This code writes the output to a file with codecs.open(file_name+'.log', mode='w', encoding='utf-8') as f: # Name the output file f.write(u'CRID|Title|Genre|Rating|Short Synopsis|Medium Synopsis|Long Synopsis\n') for info in root.xpath('//xmlns:ProgramInformation', namespaces=nsmap): titlex = info.find('.//xmlns:Title[xml:lang="PL"]', namespaces=nsmap) # Retreve the title title = titlex.text if titlex != None else 'Missing' # If there isn't a title, print an alternative word f.write(u'{}\n'.format(title)) # Write all the retrieved values to the same line with bar seperators and a new line </code></pre> </question> <answer tick="false" vote="3"> <p><strong>使用<pre><code>find()</code></pre></strong></p> <p><pre><code>xml</code></pre>中的<pre><code>xml:lang</code></pre>前缀不需要在XML文档中声明,但是如果你想在XPath查找中使用<pre><code>xml:lang</code></pre>(使用<pre><code>find()</code></pre>或<pre><code>findall()</code></pre>),你必须定义一个前缀Python 代码中的映射。</p> <p><pre><code>xml</code></pre>前缀是保留的(与任意的“正常”命名空间前缀相反)并定义为绑定到<pre><code>http://www.w3.org/XML/1998/namespace</code></pre>。请参阅 <a href="http://www.w3.org/TR/REC-xml-names/#ns-decl" rel="nofollow noreferrer">XML 1.0 中的命名空间</a> W3C 建议。</p> <p>示例:</p> <pre><code>from lxml import etree # Required mapping when using "find" nsmap = {"xml": "http://www.w3.org/XML/1998/namespace"} XML = """ <root> <Title xml:lang="FR" type="main">Les Tudors</Title> <Title xml:lang="DE" type="main">Die Tudors</Title> <Title xml:lang="IT" type="main">The Tudors</Title> </root>""" doc = etree.fromstring(XML) title_FR = doc.find('Title[@xml:lang="FR"]', namespaces=nsmap) print(title_FR.text) </code></pre> <p>输出:</p> <pre><code>Les Tudors </code></pre> <p>如果 <pre><code>xml</code></pre> 前缀没有映射,您会收到“在前缀映射中找不到<em>前缀 'xml'”错误。如果映射到 </em><code>xml</code><pre> 前缀的 URI 不是 </pre><code>http://www.w3.org/XML/1998/namespace</code><pre>,则上面代码片段中的 </pre><code>find</code><pre> 方法不会返回任何内容。</pre> </p><p>使用<strong><code>xpath()</code><pre></pre></strong> </p>使用<p><code>xpath()</code><pre>方法,不需要前缀:URI映射:</pre> </p><code>title_FR = doc.xpath('Title[@xml:lang="FR"]')[0] print(title_FR.text) </code><pre> </pre>输出:<p> </p><code>Les Tudors </code><pre> </pre> </answer> <answer tick="false" vote="0">如果您可以控制 <p><code>xml</code><pre> 文件,则应将 </pre><code>xml:lang</code><pre> 属性更改为 </pre><code>lang</code><pre> 。</pre> </p>或者如果您没有该控制权,我建议在 nsmap 中添加 <p><code>xml</code><pre>,例如 -</pre> </p><code>nsmap = {'xmlns': 'urn:tva:metadata:2012', 'mpeg7': 'urn:tva:mpeg7:2008', 'xml': '<namespace>'} </code><pre> </pre> </answer></body>
问题描述
投票:0
回答:0
python
xml
lxml
最新问题
nginx 重定向到索引页面
如何在Python中计算math.sqrt(-1)?
Angular 19 独立组件错误:尽管导入了 HttpClientModule,“没有 _HttpClient 的提供程序”
不同加数问题贪心算法
我无法在 Ajax 中执行 Perl 脚本
AVX2 / gcc:通过使用不同的寄存器来提高CPU级并行性
我无法在ajax中执行perl脚本
实体框架。直接编辑集合导航属性时的奇怪行为
在Python中检测比例参考线坐标
如何防止我的Python脚本在Windows上运行后立即关闭?
Gridgain9 是 ignite2 还是 ignite3 的下游
如何修改JavaFX中的ChoiceBox复选标记?
在pygame中实时播放带有alpha通道和同步音频的两个混合视频?
如何在cypher-shell中使用环境变量NEO4J_PASSWORD
ASP Classic IPN 侦听器可以工作,但现在不行了
如何实际使用 cv2.estimateAffine3D 在 python 中对齐 3d 点?
如何在 R 中生成具有跨多个组的 FDR 校正 P 值的分层汇总表
我无法使用 Exact Alarm 进行颤振本地通知
Azure OpenAI Studio Playground:在向任何函数提交输出时,我的助手总是返回未定义的错误
如何对Bull.js与Redis服务器的连接实现完整而非部分的TLS保护?
© www.soinside.com 2019 - 2024. All rights reserved.