XPath 如何以名称空间不知道的方式识别谓词中的属性[重复]

2023-12-29

我有以下 XML 文件:

<foo:a xmlns:foo=\"http://www.foo.com\">
    <foo:b foo:bar=\"zar\">
    </foo:b>
</foo:a>

为了得到b具有属性的节点bar具有值“zar”(全部位于正确的命名空间中),我可以使用 XPath 表达式:

/foo:a/foo:b[@foo:bar=\"zar\"]

(“foo”正确绑定到“http://www.foo.com http://www.foo.com“ - 参见最后的代码)

但是,当我想以不知道命名空间的方式执行相同操作时,尽管我可以通过依赖从元素中删除命名空间local-name()函数,我无法从属性中删除它们。

这是我能想到的最好的:

/*[local-name()='a']/*[local-name()='b' and @foo:bar=\"zar\"]

(where foo遗憾的是,它被用来限定bar属性)。

如何在完全删除命名空间的情况下编写上述表达式?

下面的代码已经过使用和不使用的测试撒克逊-HE-9.4.jar在 CLASSPATH 上并产生正确的结果,但我无法从第二个 XPath 表达式中获取“foo”名称空间前缀!

import java.io.*;
import java.util.*;
import javax.xml.xpath.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import javax.xml.namespace.NamespaceContext;

public class FooMain {

    public static void main(String args[]) throws Exception {

        String xmlSample = "<foo:a xmlns:foo=\"http://www.foo.com\"><foo:b foo:bar=\"zar\"></foo:b></foo:a>";
        XPath xpath = namespaceAwareXpath("foo", "http://www.foo.com");
        {
            System.out.printf("[NS-aware           ] Number of 'b' nodes with foo:bar attribute having the value \"zar\" is: %d\n", 
                              ((NodeList) xpath.compile("/foo:a/foo:b[@foo:bar=\"zar\"]").evaluate(stringToXML(xmlSample, true),
                               XPathConstants.NODESET)).getLength());
        }
        {
            System.out.printf("[NS-aware but using local-name() ] Number of 'b' nodes with foo:bar attribute having the value \"zar\" is: %d\n", 
                              ((NodeList) xpath.compile("/*[local-name()='a']/*[local-name()='b' and @foo:bar=\"zar\"]").evaluate(stringToXML(xmlSample, true),
                               XPathConstants.NODESET)).getLength());
        }
    }


    public static XPath namespaceAwareXpath(final String prefix, final String nsURI) {
        XPathFactory xPathfactory = XPathFactory.newInstance();
        XPath xpath = xPathfactory.newXPath();
        NamespaceContext ctx = new NamespaceContext() {
                @Override
                public String getNamespaceURI(String aPrefix) {
                    if (aPrefix.equals(prefix))
                        return nsURI;
                    else
                        return null;
                }
                @Override
                public Iterator getPrefixes(String val) {
                    throw new UnsupportedOperationException();
                }
                @Override
                public String getPrefix(String uri) {
                    throw new UnsupportedOperationException();
                }
            };
        xpath.setNamespaceContext(ctx);
        return xpath;
    }    

    private static Document stringToXML(String s, boolean nsAware) throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(nsAware);
        DocumentBuilder builder = factory.newDocumentBuilder();
        return builder.parse(new ByteArrayInputStream(s.getBytes("UTF-8")));
    }


}

/*[local-name()='a']/*[local-name()='b' and @*[local-name() = 'bar']=\"zar\"]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XPath 如何以名称空间不知道的方式识别谓词中的属性[重复] 的相关文章

随机推荐

  • 将 .next() 与 takeUntil 一起使用时的参数

    我最近注意到升级我的 rxjs 版本后你不能使用 next method this ngUnsubscribe next 就像下面这样 export class TakeUntilComponent implements OnDestroy
  • 所有的java小程序都到哪里去了? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 当java还很年轻的时候 人们对编写小程序感到兴奋 在一段时间内 它们很酷并且很受欢迎 现在 我再也见不到他们了 相反 我们有 flash ja
  • Angular JS $locationChangeStart 获取下一个 url 路由对象

    我正在尝试在我的角度应用程序上实现授权 当更改路线时 我想检查该路线是否已为用户授权 我尝试过 routeChangeStart但这并不能阻止该事件的发生 我当前的代码 scope on routeChangeStart function
  • ArrayAdapter getView() 方法如何工作?

    我想做一个ArrayAdapter显示图像和文本 如果可能的话我不想举例 我希望有人向我解释如何getView works Thanks getView 是适配器的主要部分 它返回View它将显示为您的列表 网格 图库 任何使用适配器项目的
  • 更新 Cocos2d 中的标签值

    我正在 cocos2d 中制作一个游戏 在更新分数时 旧分数值会出现在标签上 而新值会被覆盖 我正在使用以下代码来显示分数 LblScore CCLabel labelWithString NSString stringWithFormat
  • 利用Android 4.4 KitKat中的半透明状态栏

    当我发布适用于 Android 4 0 4 3 的笔记应用程序时 我使用了自定义操作栏颜色和自定义操作栏图标 而不是使用标准的浅色和深色操作栏 我想在 Android 4 4 上做到这一点 状态栏也将采用我在操作栏中使用的自定义颜色 FFD
  • Play Framework scala 如何创建临时变量

    嗨 所以我有一个 while 循环 for i lt 0 until consoles size Do something Add records to a column 但我想添加一个变量 并根据发生的情况将其添加到不同的组 例如 var
  • Spark Streaming现在支持Kafka 1.1.0吗?

    现在spark版本是2 3 我看到了maven中央存储库 https search maven org search 7Cga 7C1 7Cg 3A 22org apache spark 22 https search maven org
  • gnuplot:绘制来自标准输入的两个数据集

    我在尝试从 gnuplot 中的 stdin 绘制两个不同的数据集时遇到一些问题 这是我正在测试的命令 gnuplot persist lt
  • 在 NSArray 中搜索最近的数字

    有没有一种简单的方法可以搜索NSArray找到与用户输入数字最接近 或精确 如果存在 匹配的数字 假设我有一个像这样的数组 7 23 4 11 18 2 然后用户输入5 该程序按紧密度降序返回三个最接近的值 4 7 2 and 最重要的是给
  • 克服 java.net.MalformedURLException: 无协议异常

    我有一个属性文件 其中包含一个属性 指定包含温度数据集的 NOAA 网站的 URL 该属性包含一个 DATE REPLACE 令牌 因为当 NOAA 生成新的预报时 URL 每天都会变化 在我的属性文件中 我指定 WEATHER DATA
  • 如何告诉 maven-shade-plugin 保留签名?

    我正在使用 maven shade plugin 将两个单独的 jar 组合成一个组合的 jar 其中一个罐子有签名 而另一个则没有 如果我使用插件的默认配置 它将构建一个损坏的 jar 因为新清单缺少签名所需的摘要 我可以通过排除签名文件
  • ASP.NET 图表控件无法在生产服务器上运行

    我有一个严重依赖图表的应用程序 目前图表可以在 ASP Net 开发服务器中工作 但是当我尝试发布到我的服务器 Win 2008 Server R2 IIS 7 时 图表不显示 使用 Firebug 我可以看到对 ChartImg axd
  • 识别解析实例的依赖关系 - IoC (autofac)

    有没有办法确定哪个调用者 依赖项正在解析它所依赖的实例 这就是我的想法 public class A public A Console Write I am being resolved by 0 public class B public
  • Javascript 是一个合适的密码学平台吗?或者说,可以吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Webhooks 可以与 GitHub OAuth 应用程序一起使用吗?

    所以我一直在阅读 GitHub 开发人员文档 关于 webhooks 他们有以下声明 Webhooks 允许您构建或设置订阅 GitHub com 上某些事件的 GitHub 应用程序 当这些事件之一被触发时 我们将向 Webhook 的配
  • 在谷歌电子表格中将单元格格式设置为分钟:秒

    我希望记录我完成某个编程问题所需的时间数据 我正在使用谷歌电子表格来保持我的表现 面临的问题是 我希望细胞接受结果mm ss 但谷歌表正在将其转换为12 hr格式即hh mm ss 我怎样才能阻止这种情况发生 例如 1 30被转换为凌晨 1
  • GO存储数据返回EOF

    我是 golang 新手 我正在尝试构建 Rest api 到目前为止 GET 端点对我来说工作得很好 但是我在使用 POST 方法 创建用户 时遇到了困难 这就是我的 User 结构的样子 type User struct ID uint
  • 处理失败的期货

    在 Play Framework 2 3 中 操作可以从成功的未来调用中产生结果 如下所示 def index Action async val futureInt scala concurrent Future intensiveComp
  • XPath 如何以名称空间不知道的方式识别谓词中的属性[重复]

    这个问题在这里已经有答案了 我有以下 XML 文件