当前位置: 首页 > 面试题库 >

XPath为带有defaultNamespace的xml返回null

董谦
2023-03-14
问题内容

我相信它在某个时候可以工作,但是现在xpath返回null。有人可以帮助我在以下代码中找到我的愚蠢错误吗?
还是即使在setNamespaceAware(false)之后也必须提供NamespaceContext?

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(false);
domFactory.setIgnoringComments(true);
domFactory.setIgnoringElementContentWhitespace(true);

try {
 Document doc = domFactory.newDocumentBuilder().parse(new File("E:/Temp/test.xml"));
 XPath xp = XPathFactory.newInstance().newXPath();
 NodeList nl = (NodeList) xp.evaluate("//class", doc, XPathConstants.NODESET);
 System.out.println(nl.getLength());
}catch (Exception e){
 e.printStackTrace();
}

XML文档在这里:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="http://www.example.com/schema">
 <class />
 <class />
</root>

问题答案:

三个选择是显而易见的。按照我的观点,最简单的顺序是:

  • 将XPath从更改"//class""//*[local-name() = 'class']"。有点笨拙,但它将忽略名称空间。如果仍然为您提供零,则说明问题不在于名称空间。
  • 在您的Java代码中为“ http://www.example.com/schema”注册一个名称空间前缀,并在您的XPath表达式中使用它: "//foo:class"
  • 弄清楚您正在使用哪种解析器实现以及为什么它与@Rodney的行为不同,或者更改为其他解析器实现


 类似资料:
  • 让我预先感谢你的帮助! 我在一个spring boot应用程序中有一个奇怪的行为。我来给你解释一下: 我正在用一些不错的rest-json服务包装一些遗留的Web服务(自定义xml消息)(通过spring-mvc和Spring boots并使用jackson序列化东西) 为了与遗留系统通信,我创建了一个自定义XmlMapper、序列化器和反序列化器。 最后,我创建了一个httpclientconf

  • 所以我得到了一个xml文件从肥皂服务(我无法控制)。它返回了一个xmlns,这导致了简单的XML问题。我正在运行一个str_replace来解决这个问题,但是现在simpleXML只返回一个空对象。XML结构看起来很好,没有错误,只是一个空对象。 返回:SimpleXMLElement对象() str replace之前的XML源是: 更换后: 任何帮助都将不胜感激,这快把我逼疯了! ----因此

  • 我正在使用spring boot和jersey(我使用过spring-boot-starter-jersey)开发网关api。我应该同时返回xml和json响应,它似乎可以使用json响应,但当对xml发出请求时,我得到404。这是服务的代码 谢谢你帮了我很多忙。 向sajid致意

  • 在上周之前,我使用Python的经验非常局限于我们网络上的大型数据库文件,突然间,我开始尝试从html表中提取信息。 经过大量阅读,我选择在Python2.7中使用lxml和xpath来检索相关数据。我使用以下代码检索了一个字段: 产生了以下清单: 我认识到CR/LF和制表符转义字符,我想知道如何避免它们?

  • 有人能举一个例子,说明在VTD XML解析器中使用联合运算符(|)吗?以下内容不适用于VTD XML解析器,但适用于jxpath解析器/a |/b

  • 问题内容: 我知道我不是第一个遇到这个问题的人,但是我似乎找不到有效的解决方案 使用网络服务集返回json时,.net仍将其包装在XML包装器中。 我搜索并尝试了很多东西 正如某些帖子中所建议的,我尝试将各种httphandler设置添加到我的web.config中,但是这些没有效果。我也不认为这是必要的,因为我正在使用全新的win7 / iis7.5 / .net4机器。我读到,由于.net 3