它是xpath(lxml)错误吗? [英] Is it a xpath (lxml) bug?

查看:96
本文介绍了它是xpath(lxml)错误吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有我的xpath:

//*[namespace-uri() = 'http://foundation.org/UA/2011/03/NodeSet.xsd'][local-name() = 'Reference'][@ReferenceType = 'HasNotifier']/../../Description[@Locale="en"]

,但不适用于此xml文件.也许是我的错误,或者是lxml错误...我不知道.我正在尝试几天来创建正确和正确的xpath代码.但是unfurnetli,我无法做到这一点:(是lxml错误还是我的错误?

but don't work with this xml file. Maybe is my mistake, or maybe is a lxml bug ... i don't know. I'm trying few day to create right and correct xpath code. But unfurnetli, i can't do this correct :( Is it a lxml bug or my mistake ?

如果"HasNotifier"显示"002CC-ESSO01.(WAAA05.01?1)",我想得到什么

What I want to get, if "HasNotifier" print "002CC-ESSO01.(WAAA05.01?1)"

我的XML文件示例:

<?xml version="1.0" encoding="UTF-8" ?>
<!-- created at 2017-03-09 08:23:40 -->
<UANodeSet xmlns="http://foundation.org/UA/2011/03/NodeSet.xsd" xmlns:uax="http://foundation.org/UA/2008/02/Types.xsd">
    <NamespaceUris>
        <Uri>http://www.vise.com/Server/UA/</Uri>
    </NamespaceUris>
    <Aliases>
        <!-- data types -->
        <Alias Alias="Boolean">i=1</Alias>
        <Alias Alias="SByte">i=2</Alias>
        <Alias Alias="Byte">i=3</Alias>
        <Alias Alias="Int16">i=4</Alias>
        <Alias Alias="UInt16">i=5</Alias>
        <Alias Alias="Int32">i=6</Alias>
        <Alias Alias="UInt32">i=7</Alias>
        <Alias Alias="Int64">i=8</Alias>
        <Alias Alias="UInt64">i=9</Alias>
        <Alias Alias="Float">i=10</Alias>
        <Alias Alias="Double">i=11</Alias>
        <Alias Alias="String">i=12</Alias>
        <Alias Alias="DateTime">i=13</Alias>
        <Alias Alias="ByteString">i=15</Alias>
        <Alias Alias="XmlElement">i=16</Alias>
        <Alias Alias="NodeId">i=17</Alias>
        <Alias Alias="LocalizedText">i=21</Alias>
        <!-- references -->
        <Alias Alias="Organizes">i=35</Alias>
        <Alias Alias="HasEventSource">i=36</Alias>
        <Alias Alias="HasModellingRule">i=37</Alias>
        <Alias Alias="HasTypeDefinition">i=40</Alias>
        <Alias Alias="HasSubtype">i=45</Alias>
        <Alias Alias="HasProperty">i=46</Alias>
        <Alias Alias="HasComponent">i=47</Alias>
        <Alias Alias="HasNotifier">i=48</Alias>
        <!-- types -->
        <Alias Alias="BaseDataType">i=24</Alias>
        <Alias Alias="BaseObjectType">i=58</Alias>
        <Alias Alias="FolderType">i=61</Alias>
        <Alias Alias="BaseVariableType">i=62</Alias>
        <Alias Alias="PropertyType">i=68</Alias>
        <!-- modelling rules -->
        <Alias Alias="New">i=78</Alias>
        <Alias Alias="Shared">i=79</Alias>
    </Aliases>
    <UAObject NodeId="ns=1;s=AGENT" BrowseName="1:AGENT">
        <DisplayName Locale="en">AGENT</DisplayName>
        <Description Locale="en">AGENT</Description>
        <References>
            <Reference ReferenceType="HasComponent" IsForward="false">i=85</Reference>
            <Reference ReferenceType="HasTypeDefinition">ns=1;s=ObjectTypes.VISE.Server.Local</Reference>
        </References>
        <Extensions>
            <VISE ExportedNodeId="ns=1;s=AGENT.OBJECTS.WAAA05.01.002CC-ESSO01" ExportedBrowseName="1:002CC-ESSO01" Upstream="true"/>
        </Extensions>
    </UAObject>
    <UAObject NodeId="ns=1;s=AGENT.OBJECTS" BrowseName="1:OBJECTS">
        <DisplayName Locale="en">OBJECTS</DisplayName>
        <Description Locale="en">OBJECTS</Description>
        <References>
            <Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT</Reference>
            <Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
        </References>
        <Extensions>
            <VISE Upstream="true"/>
        </Extensions>
    </UAObject>
    <UAObject NodeId="ns=1;s=AGENT.OBJECTS.WAAA05" BrowseName="1:WAAA05">
        <DisplayName Locale="en">WAAA05</DisplayName>
        <Description Locale="en">WAAA05</Description>
        <References>
            <Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.OBJECTS</Reference>
            <Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
        </References>
        <Extensions>
            <VISE Upstream="true"/>
        </Extensions>
    </UAObject>
    <UAObject NodeId="ns=1;s=AGENT.OBJECTS.WAAA05.01" BrowseName="1:01">
        <DisplayName Locale="en">01</DisplayName>
        <Description Locale="en">01</Description>
        <References>
            <Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.OBJECTS.WAAA05</Reference>
            <Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
        </References>
        <Extensions>
            <VISE Upstream="true"/>
        </Extensions>
    </UAObject>
    <UAObject NodeId="ns=1;s=AGENT.OBJECTS.WAAA05.01.002CC-ESSO01" BrowseName="1:002CC-ESSO01">
        <DisplayName Locale="en">002CC-ESSO01</DisplayName>
        <Description Locale="en">002CC-ESSO01</Description>
        <References>
            <Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.OBJECTS.WAAA05.01</Reference>
            <Reference ReferenceType="HasTypeDefinition">ns=1;s=ObjectTypes.PROJECT.Foren.Notek_Table</Reference>
            <Reference ReferenceType="HasComponent">ns=1;s=ObjectTypes.PROJECT.Foren.Notek_Table.Overview</Reference>
            <Reference ReferenceType="HasComponent">ns=1;s=ObjectTypes.PROJECT.Foren.Notek_Table.Version</Reference>
        </References>
    </UAObject>
    <UAVariable NodeId="ns=1;s=AGENT.OBJECTS.WAAA05.01.002CC-ESSO01.Pressed" BrowseName="1:Pressed" DataType="Boolean" AccessLevel="7" UserAccessLevel="7" Historizing="true">
        <DisplayName Locale="en">Pressed</DisplayName>
        <Description Locale="en">002CC-ESSO01.(WAAA05.01?1)</Description>
        <References>
            <Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.OBJECTS.WAAA05.01.002CC-ESSO01</Reference>
            <Reference ReferenceType="HasTypeDefinition">BaseVariableType</Reference>
            <Reference ReferenceType="HasNotifier">ns=1;s=ObjectTypes.PROJECT.Foren.Notek_Table.Pressed.ButtonPressed</Reference>
        </References>
        <Value>
            <uax:Boolean>false</uax:Boolean>
        </Value>
    </UAVariable>
    <UAVariable NodeId="ns=1;s=AGENT.OBJECTS.WAAA05.01.002CC-ESSO01.Pressed.MirrorInput" BrowseName="1:MirrorInput" DataType="String" AccessLevel="7" UserAccessLevel="7" Historizing="true">
        <DisplayName Locale="en">MirrorInput</DisplayName>
        <Description Locale="en">MirrorInput</Description>
        <References>
            <Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.OBJECTS.WAAA05.01.002CC-ESSO01.Pressed</Reference>
            <Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.VISE.Mirror.Input</Reference>
        </References>
        <Value>
            <uax:String>Serwise/ns=4;s=Signals.WAAA05_01_002CC_ESSO01</uax:String>
        </Value>
    </UAVariable>
</UANodeSet>

推荐答案

这不是lxml错误.这是一个有效的XPath表达式:

It is not an lxml bug. Here is an XPath expression that works:

//*[local-name() = 'Reference'][@ReferenceType = 'HasNotifier']/../../*[local-name() = 'Description'][@Locale='en']

您不需要namespace-uri() = ...,但您必须使用*[local-name() = 'Description'],而不仅仅是Description.

You don't need namespace-uri() = ... but you have to use *[local-name() = 'Description'] instead of just Description.

另一种实现方法是这样.声明名称空间URI的前缀,并在表达式中使用它:

Another way to do it is this. Declare a prefix for the namespace URI and use it in the expression:

from lxml import etree

NS = {'ns': 'http://foundation.org/UA/2011/03/NodeSet.xsd'}      
doc = etree.parse("nodeset.xml")
expr = "//ns:Reference[@ReferenceType = 'HasNotifier']/../../ns:Description[@Locale = 'en']"    
print(doc.xpath(expr, namespaces=NS)[0].text)

输出:

002CC-ESSO01.(WAAA05.01?1)

这篇关于它是xpath(lxml)错误吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆