2

我正在使用 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(而不是根据它的兄弟“ittype”动态获取“资源” -node :

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

我已经尝试了很多方法来格式化 xpath 以动态找到我想要的“资源” -节点,我不可能在这里全部列出它们;但是,这是我尝试过的一个示例,在我看来它应该可以工作;不知道我做错了什么......

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

我用谷歌搜索了很多,包括在 SO 上,但找不到非常相似的地方;而我确实找到的东西,翻译得不够好,无法让我发现我需要做的事情。例如,即使它非常相似,这个 SO似乎也不起作用。



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

根据反馈,我试过这个:

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

没有骰子:org.simpleframework.xml.core.PathException:“链接”字段中路径“元数据/资源/资源[ittype='Service_Links']”的索引无效

4

3 回答 3

1

我从来没有用 SimpleXml 来实现这种风格的 XPath;从更彻底地阅读他们的文档来看,他们似乎还没有实现这个 XPath 功能。

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

于 2012-11-05T16:23:55.737 回答
0

我不具体了解 SimpleXML,但是这个 xpath 应该可以为您提供所需的元素:

metadata/resources/resource[ittype = 'Service_Links']
于 2012-09-28T23:21:29.523 回答
0
  1. 您的 xml 示例格式不正确。该link元素没有其关闭对应物。这同样适用于descriptionel。我认为这些只是错别字。
  2. 这是有效的 XPath 表达式:

/metadata/resources/resource/links/link[parent::links/preceding-sibling::ittype/text()=='Service_Links']

或更简单的版本:

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

于 2012-09-28T23:24:20.280 回答