在互联网上,我找到了许多有关如何实现此功能的示例,但是在我看来,这些示例都不起作用。 我有一个包含XML数据的字符串,而且我知道结果的XPath应该是什么样子。 例如,我有一个如下所示的xml结构:

   <?xml version="1.0"?>
     <m:parent xmlns:m="http://www.somescheme">
      <doc:header xmlns:doc="http://www.somescheme">
        <doc:documentId>137</doc:documentId>
        <doc:documentDescription>Some Description</doc:documentDescription>  
         <doc:task>
           <doc:id>49</doc:id>
           <doc:name>Some Name</doc:name>
           <doc:description>Some Task Description</doc:description>
           <doc:outcome/>
           <doc:dueDate/>
           <doc:priority>50</doc:priority>
          </doc:task>
        </doc:header>
        <m:otherinfo>234324</m:otherInfo>
      </m:parent>

比如说我需要访问和更新otherInfo,那么XPath应该是“ m:parent / m:otherInfo”,我应该能够读取和设置它。 对于doc:outcome,它将是'm:parent / doc:header / doc:task / doc:outcome'。这是我需要在运行时设置的值。

Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(
        new InputSource("data.xml"));

    XPath xpath = XPathFactory.newInstance().newXPath();
    NodeList nodes = (NodeList) xpath.evaluate("//m:parent/doc:header/doc:task/doc:outcome", doc,
        XPathConstants.NODESET);

代码应该像上面一样,但是我没有得到结果,

你能指出我想念的东西吗?

此致Max

#1楼 票数:0 已采纳

您必须另外做两件事,才能使用命名空间评估XPATH表达式。

  1. 默认情况下, DocumentBuilderFactory实例不支持名称空间。 因此,您必须调用setNamespaceAware(true)
  2. 创建接口NamespaceContext自己的实现,并将其传递给XPath实例。

这里是一个简单的NamespaceContext实现,它是一个静态内部类。 此处仅实现getNamespaceURI()方法。 有关更多详细信息和替代实现,请参阅此IBM developerWorks文章: 将Java语言NamespaceContext对象与XPath结合使用

static class MyNamespaceContext implements NamespaceContext {
  @Override
  public String getNamespaceURI(String prefix) {
    if(prefix == null) {
      throw new IllegalArgumentException();
    } else if(prefix.equals(XMLConstants.DEFAULT_NS_PREFIX)) {
      return XMLConstants.NULL_NS_URI;
    } else if(prefix.equals(XMLConstants.XML_NS_PREFIX)) {
      return XMLConstants.XML_NS_URI;
    } else if(prefix.equals(XMLConstants.XMLNS_ATTRIBUTE)) {
      return XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
    } else if(prefix.equals("m")) {
      return "http://www.somescheme";
    } else if(prefix.equals("doc")) {
      return "http://www.somescheme";
    } else {
      return XMLConstants.NULL_NS_URI;
    }
  }

  @Override
  public String getPrefix(String namespaceURI) {
    throw new UnsupportedOperationException();
  }

  @Override
  public Iterator getPrefixes(String namespaceURI) {
    throw new UnsupportedOperationException();
  }
}

这是DocumentBuilderFactory的一部分:

DocumentBuilderFactory documentBuilderFactory = 
    DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
Document doc = documentBuilderFactory.newDocumentBuilder().parse(
    new InputSource("data.xml"));

XPath xpath = XPathFactory.newInstance().newXPath();
xpath.setNamespaceContext(new MyNamespaceContext());
NodeList nodes = (NodeList) xpath.evaluate(
    "//m:parent/doc:header/doc:task/doc:outcome", doc,
    XPathConstants.NODESET);

这两个名称空间前缀实际上链接到相同的名称空间URI。 实际上,您只能在XPATH表达式中使用一个前缀,例如"//doc:parent/doc:header/doc:task/doc:outcome"并且无需在NamespaceContext实现中声明两者。

  ask by maxhamulyak translate from so

未解决问题?本站智能推荐:

1回复

使用xpath更新xml文档

您好,这是我的xml文档: 我想使用xpath和netbeans将jbeil中“ jojo”餐厅的评分从4.3 / 5更新为4.5 / 5,请帮助, 该代码给出了等级, 而且我只想更新名称为“ jojo”的jbeil餐厅的评分,请提供帮助
1回复

尝试使用Java和Xpath更新XML文档中任何选定节点的值

我开发了 GUI 工具,将 XML 文档显示为可编辑的 JTree,用户可以在 JTree 中选择一个节点并尝试更改 XML 文档中的实际节点值。 我遇到的问题是构建尝试实际更新的正确 Xpath 查询。 这是 JTree 的 GUI,显示哪个元素被选中并应该被编辑: 它是一个非常大的 XML,所
8回复

如何使用XPath和Java更新XML

我有一个 XML 文档,以及该文档的 XPath 表达式。 我必须在运行时使用 XPath 更新文档。 如何使用 Java 执行此操作? 下面是我的xml: 我必须在//PersonList/Person[2]/Name下更改 name 和 age 的值。
1回复

在Java中使用XPATH过滤XML文档

我有以下XML文档,我需要使用xpath表达式进行过滤: 我提供以下表达式:“ / List / Item / Category [Name ='123']”,它给了我: 但是我需要这个输出:
2回复

用Java解析XML文档

我想从给定col_alt表标签中找到@name 。 谁能帮我这个忙。 javax.XML.Xpath是否可能? 如果没有,您可以建议其他方法来找到它。 这是XML数据的示例:
1回复

使用Java在文档中的任何位置定位XML元素

给出以下XML(示例): 我需要获取Variant和Version的值。 我目前的方法是使用XPath,因为我不能依赖给定的结构。 我所知道的是文档中某处有一个元素rsb:Version 。 然而,这不输出任何东西。 我尝试了以下XPath表达式: //变 //变体/文
1回复

使用Java中的XPATH处理分层XML文档。效率?

这个问题的变体已经在这里被问过好几次了,但是我的问题更多是关于在Java中使用XPATH的一般效率的问题。 我的任务:获取有关地理位置的Wikipedia文章,并从中创建分层数据结构。 我已经获得了Wiki页面的XML版本,并根据直观的模式重新格式化了格式。 我还制作了一系列非常简单的
3回复

JAVA:使用XPath表达式构建XML文档

我知道这不是XPath的真正含义,但如果我有一个XPath表达式的HashMap来评估如何构建XML文档。 我找到了dom-4j的DocumentHelper.makeElement(branch,xpath),除了它无法创建属性或索引。 当然存在可以做到这一点的图书馆? 会导致: