【问题标题】:How to query xpath with powershell with namespace如何使用带有命名空间的powershell查询xpath
【发布时间】:2019-10-01 09:43:29
【问题描述】:

我有一个带有命名空间的 xml,现在我不知道如何使用 Select-XML cmdlet 来评估 xpath 字符串。具体我想用键 foobar 检索表单域的值。

所以我的 xpath 查询是

 /ns3:penrequest/formfields/field[@key='foobar']/@value

在我的 Powershell 脚本中,我尝试使用它

Select-XML -path $filename -xpath "/ns3:penrequest/formfields/field[@key='foobar']/@value"

这会导致以下错误

Select-Xml : Namespace-Manager oder 'XsltContext' erforderlich. Diese Abfrage hat einen Präfix, eine Variable oder eine
benutzerdefinierte Funktion.
In Zeile:1 Zeichen:1
+ Select-Xml -Path .\datapath\sample.xml -XPath "/ns3:penrequest/formfi ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Select-Xml], XPathException
    + FullyQualifiedErrorId : System.Xml.XPath.XPathException,Microsoft.PowerShell.Commands.SelectXmlCommand

如何在这里定义命名空间?

这是我的示例 xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns3:penrequest xmlns:ns2="urn:srs.pdx.metadata" 
    xmlns:ns3="urn:de.srs.pen.virtual.request" 
    xmlns:ns4="urn:srs.pdx.servicelist" 
    xmlns:ns5="urn:srs.pdx.metaxaconfig" 
    xmlns:ns6="http://verification.ws.pen.srs.de/" formid="QS_MFFM_Reinigung_18_50_1_1" instanceid=".2000000031896" pduser="SYSTEM/system" penid="SRS-000-EE0-3Q" start="2019-09-17T14:10:33.620+02:00" stop="2019-09-09T12:00:47.439+02:00" transmission="2019-09-30T15:37:15.050+02:00" creator="MFFM/test_ma" pageid="" patternid="" updates="6" clientid="PDiX API V5.0.5-SNAPSHOT0" lastupdate="2019-09-17T12:38:29.677Z">
    <sessions>
        <session order="1" created="2019-09-17T12:10:33.620Z" finished="2019-09-17T12:10:33.620Z" sourcetype="VP" firstProcessed="2019-09-17T12:10:33.620Z" lastProcessed="2019-09-17T12:10:33.620Z" extended="0" device="TBS-000-MFF-02" datahash="5db0c36f4378d308394b75b3c5990cad2bc87402" user="MFFM/test_ma" lastupdate="2019-09-17T12:10:33.637Z"/>
    </sessions>
    <formfields>
        <field group="" key="foobar" fullname="foobar" value="35000013" start="2019-09-17T14:10:33.620+02:00" stop="2019-09-17T14:10:33.620+02:00" sourcetype="VP" fieldtype="EF" icrconfidence="100000" icrrecognition="100000" pageid="" device="TBS-000-MFF-02" sessionid="1" updateid="1" user="MFFM/test_ma" lastupdate="2019-09-17T12:10:34.233Z">
            <details>
                <detail session="1" value="35000013" start="2019-09-17T14:10:33.620+02:00" end="2019-09-17T14:10:33.620+02:00" user="MFFM/test_ma" lastupdate="2019-09-17T12:10:34.233Z"/>
            </details>
            <attributes/>
        </field>
        <field group="" key="someOtherText" fullname="someOtherText" value="sample" start="2019-09-17T14:10:33.620+02:00" stop="2019-09-17T14:10:33.620+02:00" sourcetype="VP" fieldtype="EF" icrconfidence="100000" icrrecognition="100000" pageid="" device="TBS-000-MFF-02" sessionid="1" updateid="1" user="MFFM/test_ma" lastupdate="2019-09-17T12:10:34.250Z">
            <details>
                <detail session="1" value="sample" start="2019-09-17T14:10:33.620+02:00" end="2019-09-17T14:10:33.620+02:00" user="MFFM/test_ma" lastupdate="2019-09-17T12:10:34.250Z"/>
            </details>
            <attributes/>
        </field>

    </formfields>
    <attributes>
        <attribute module="foo" name="state" value="OK" device="1" user="test" lastupdate="2019-09-17T12:38:29.643Z"/>
    </attributes>
</ns3:penrequest>

【问题讨论】:

    标签: powershell xpath


    【解决方案1】:

    基于避免命名空间问题的实用解决方案是使用PowerShell的点符号忽略 命名空间:

    [xml] $xmlDoc = Get-Content -Raw $filename
    $xmlDoc.penrequest.formfields.field.Where({ $_.key -eq 'foobar' }).value
    

    使用Select-Xml的命名空间有点麻烦:

    # Wrap in (...).Node.Value to extract the matched attribute's *text*.
    Select-Xml -Path $filename `
      -NameSpace @{ ns3 = 'urn:de.srs.pen.virtual.request' } `
      -XPath "/ns3:penrequest/formfields/field[@key='foobar']/@value"
    

    注意参数-NameSpace 需要一个哈希表 (@{ ... }) 来映射 XPath 查询中使用的所有命名空间限定元素的 URI。


    有关更多信息,请参阅this answer 相关问题。

    【讨论】:

      【解决方案2】:

      使用local-name() 忽略命名空间

      /*[local-name()='penrequest']/formfields/field[@key='foobar']/@value
      

      【讨论】:

        猜你喜欢
        • 2015-11-14
        • 2011-12-24
        • 2013-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多