首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Xml命名空间破坏了我的xpath!

Xml命名空间破坏了我的xpath!
EN

Stack Overflow用户
提问于 2011-03-09 07:37:11
回答 4查看 95.4K关注 0票数 109

我有以下XML:

代码语言:javascript
复制
<List xmlns="http://schemas.microsoft.com/sharepoint/soap/">
 <Fields>
   <Field>
   </Field>
 </Fields>
</List>

这是从SharePoint web服务返回的XML的精简版本。我还有以下xPath:

代码语言:javascript
复制
/List/Fields/Field

当我从我的XML中删除xmlns时,xPath可以正常工作。当它在里面的时候,我的xPath什么也找不到。对于我的xPath,有什么我应该做的不同的事情吗?修改XML不是一个选项。

EN

回答 4

Stack Overflow用户

发布于 2011-03-09 08:19:13

List元素定义了一个默认的名称空间,内部的所有元素都采用这个名称空间。

因此,您需要忽略元素名称空间,如下所示:

代码语言:javascript
复制
/*[local-name()='List']/*[local-name()='Fields]/*[local-name()='Field]

但这意味着xpath将使用List - Fields - Field拾取任何其他元素

您可以执行名称空间检查以及本地名称检查,如下所示:

代码语言:javascript
复制
/*[local-name()='List' and namespace-uri()='http://schemas.microsoft.com/sharepoint/soap/']/*[local-name()='Fields' and namespace-uri()='http://schemas.microsoft.com/sharepoint/soap/']/*[local-name()='Field' and namespace-uri()='http://schemas.microsoft.com/sharepoint/soap/']

或者,您可以在库中注册名称空间,然后显式指定该名称空间的前缀,并将其添加到xpath表达式中,xpath表达式的方法取决于您正在使用的库。

票数 53
EN

Stack Overflow用户

发布于 2011-03-09 07:43:37

您很可能需要在xpath库中注册该名称空间uri。根据库的不同,您可能会使用“default”前缀,也可能需要为其指定一个命名前缀并在xpath查询中使用它。

例如,在php中(因为你没有指定语言),使用DOMXPath你可以这样做:

代码语言:javascript
复制
$xpath = new DOMXPath($document);
$xpath->registerNamespace('x', 'http://schemas.microsoft.com/sharepoint/soap/');
$xpath->query('/x:List/x:Fields/x:Field');
票数 19
EN

Stack Overflow用户

发布于 2016-03-01 17:41:37

我在使用Xalan-c时遇到了这个问题

我最初没有完全理解的一点是,XPath或XSLT名称空间别名/前缀可以与文档的名称空间别名/前缀不同-这取决于您的名称空间解析器。

看起来,如果文档上有名称空间,则除非使用名称空间,否则它无法与路径元素匹配。(标准但不总是遵循?)

XalanDocumentPrefixResolver会将XPath或XSLT名称空间映射到URI,并尝试通过获取前缀来为它们提供id -如果没有前缀,则使用转换为xmlns的名称

/xmlns:List/xmlns:Fields/xmlns:Field

或者,您也可以创建自己的解析器,但它仍然需要在xpath中使用的最小名称空间:(

这是我在测试时一起破解的一个,不能保证内存

代码语言:javascript
复制
// don't care what prefix given, there can only be the one
struct NoPrefixResolver : public xalanc::PrefixResolver {

    NoPrefixResolver(const xalanc::XalanDOMString&   theURI) : m_uri(theURI){}

    virtual const xalanc::XalanDOMString*
        getNamespaceForPrefix(const xalanc::XalanDOMString&     prefix) const {
        return &m_uri;
    }

    virtual const xalanc::XalanDOMString&   getURI() const {
        return m_uri;
    }

    const xalanc::XalanDOMString    m_uri;
};

/x:List/x:Fields/x:Field 
/a:List/b:Fields/c:Field 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5239685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档