如何为具有两个命名空间的 xml 编写 xpath



我正在尝试获取标题的值,并与属性等于替代的链接。但是对于命名空间,我发现获取值有点挑战性。

我已经添加了我的命名空间,如下所示,但我的结果返回枚举没有结果:

nameSpaceManager_ = new XmlNamespaceManager(new NameTable());
nameSpaceManager_.AddNamespace("viz", "http://www.vizrt.com/atom");
nameSpaceManager_.AddNamespace("atom", "http://www.w3.org/2005/Atom");

我正在使用混合了linq和xpath的XDocument来查询我的数据。

我按如下方式使用 XPath:

var showName = showNode.XPathEvaluate("/atom:entry/atom:title/text()", nameSpaceManager_);

更新

.XML:

<?xml version="1.0" encoding="UTF-8"?>
<feed xml:base="http://127.0.0.1:8580/directory/shows/" xmlns="http://www.w3.org/2005/Atom">
    <entry xmlns="http://www.w3.org/2005/Atom" 
    xmlns:viz="http://www.vizrt.com/atom">
        <title>My Show</title>
        <author>
            <name>Media Sequencer</name>
        </author>
        <id>tag:user,2017-02-03:0:/directory/shows/My%20Show.show</id>
        <updated>2017-02-03T11:41:05Z</updated>
        <summary>Show My Show</summary>
        <category scheme="http://www.vizrt.com/types" term="directory" />
        <category scheme="http://www.vizrt.com/types" term="show" />
        <category scheme="http://www.vizrt.com/types" term="trio_4_layer_collection" label="Trio 4 Layer Collection" />
        <link type="application/atom+xml;type=feed" rel="alternate" href="http://127.0.0.1:8580/show/%7B4575C71F-FC79-4813-A92F-D6297D5C517C%7D/" />
        <link type="application/atom+xml;type=entry" rel="self" href="http://127.0.0.1:8580/directory/shows/My%20Show.show" />
        <viz:empty>false</viz:empty>
    </entry>
    <entry xmlns="http://www.w3.org/2005/Atom" 
    xmlns:viz="http://www.vizrt.com/atom">
        <title>My Show 2</title>
        <author>
            <name>Media Sequencer</name>
        </author>
        <id>tag:user,2017-02-03:0:/directory/shows/My%20Show.show</id>
        <updated>2017-02-03T11:41:05Z</updated>
        <summary>Show My Show</summary>
        <category scheme="http://www.vizrt.com/types" term="directory" />
        <category scheme="http://www.vizrt.com/types" term="show" />
        <category scheme="http://www.vizrt.com/types" term="trio_4_layer_collection" label="Trio 4 Layer Collection" />
        <link type="application/atom+xml;type=feed" rel="alternate" href="http://127.0.0.1:8580/show/%7B4575C71F-FC79-4813-A92F-D6297D5C517C%7D/" />
        <link type="application/atom+xml;type=entry" rel="self" href="http://127.0.0.1:8580/directory/shows/My%20Show.show" />
        <viz:empty>false</viz:empty>
    </entry>
</feed>

更新的查询

var exEl = xmlDoc.XPathSelectElements("//atom:feed/atom:entry[atom:category/@term='show']", nameSpaceManager_);
foreach (var showNode in exEl.Cast<XElement>())
{
    var showName = showNode.XPathSelectElement("/atom:entry/atom:title", nameSpaceManager_).Value;
    var linkTypes = showNode.XPathSelectElements("/atom:entry/atom:link[@rel='alternate']", nameSpaceManager_)
            .Select(e => e.Attribute("type").Value);
}

你几乎做对了所有事情。

只需使用XPathSelectElement而不是XPathEvaluate

var showName = showNode.XPathSelectElement("/atom:entry/atom:title", nameSpaceManager_).Value;
var linkTypes = showNode.XPathSelectElements("/atom:entry/atom:link[@rel='alternate']", nameSpaceManager_)
    .Select(e => e.Attribute("type").Value);

最新更新