XPath(SimpleXML)根据孩子的兄弟姐妹的价值选择孩子

时间:2012-09-28 22:53:12

标签: java xml xpath simple-framework

我正在使用SimpleXML(Java),我正在尝试根据列表中某个兄弟的值获取对象列表。

所以,这是我的XML:

<xml>
  <metadata>
    <resources>

      <resource>
        <ittype>Service_Links</ittype>
        <links>
          <link>
            <path>http://www.stackoverflow.com</path>
            <description>Stack Overflow</description>
          </link>
          <link>
            <path>http://www.google.com</path>
            <description>Google</description>
          </link>
        </links>
      </resource>

      <resource>
        <ittype>Article_Links</ittype>
        <links>
          ...
        </links>
      </resource>

      ...

    </resources>
  </metadata>
</xml>

我要做的是使用XPath创建一个SimpleXML注释,以获得所有“链接”的列表,其中列表的兄弟“ittype”等于“Service_Links”

因此,例如,这只有在我尝试静态获取第一个“资源” -node(而不是动态获取“资源” -node基于它的兄弟“ittype”是:

@ElementList(name="links")
@Path("metadata/resources[1]/resource")
public List<Link> link;

我已经尝试了很多方法来格式化xpath以动态找到“资源” -node我希望我不能在这里列出所有这些;然而,这是我试过的一个例子,在我看来应该有用;不知道我做错了什么......

@ElementList(name="links")
@Path("metadata/resources[resource/ittype='Service_Links']/resource")
public List<Link> link;

我已经谷歌搜索了一下,包括在这里的SO,并且发现不太相似;而我所找到的,并没有很好的翻译,以便我发现我需要做什么。例如,this SO似乎不起作用,即使它非常相似。



更新#1(8OCT @ 12:38 pm)

根据反馈,我试过这个:

@ElementList
@Path("metadata/resources/resource[ittype='Service_Links']")
public List<Link> link;

没有骰子:     org.simpleframework.xml.core.PathException:字段'links'中路径'metadata / resources / resource [ittype ='Service_Links']'的索引无效

3 个答案:

答案 0 :(得分:1)

我从来没有使用SimpleXml来实现这种样式的XPath;通过更彻底地阅读他们的文档,看起来他们还没有实现这个XPath功能。

所以我在这里找到了一个不同的XML解析策略:https://stackoverflow.com/a/13236117/483257

答案 1 :(得分:0)

我不是特别了解SimpleXML,但是这个xpath可以为你提供你想要的元素:

metadata/resources/resource[ittype = 'Service_Links']

答案 2 :(得分:0)

  1. 您的xml示例格式不正确。 link元素没有结束对应元素。这同样适用于description el。我认为这些只是错别字。
  2. 这是工作的XPath表达式:
  3. /metadata/resources/resource/links/link[parent::links/preceding-sibling::ittype/text()=='Service_Links']

    或更简单的版本:

    /metadata/resources/resource[ittype = 'Service_Links']/links/link