筛选复杂 XML 文档中的元素

Filtering elements from a complex XML document

提问人:kajoe14 提问时间:10/9/2022 最后编辑:Johny T Koshykajoe14 更新时间:10/9/2022 访问量:41

问:

我有这个 XML - 目标是在给定某些条件下从 XML 中过滤某些属性: 所以,得到一个是阿隆索并且是前锋的球员SALARYNAMEPOSITION

<PLAYERS>
  <PLAYER>
    <NAME>ALONSO</NAME>
    <POSITION>MIDFIELDER</POSITION>
    <AGE>28</AGE>
    <NATIONALITY></NATIONALITY>
    <SALARY>550000</SALARY>
  </PLAYER>
  <PLAYER>
    <NAME>MANE</NAME>
    <POSITION>STRIKER</POSITION>
    <AGE>30</AGE>
    <NATIONALITY></NATIONALITY>
    <SALARY>600000</SALARY>
  </PLAYER>
  <PLAYER>
    <NAME>ALONSO</NAME>
    <POSITION>STRIKER</POSITION>
    <AGE>23</AGE>
    <NATIONALITY>SPAIN</NATIONALITY>
    <SALARY>250000</SALARY>
  </PLAYER>
</PLAYERS>

这是我尝试的——

val salary = ("PLAYERS").flatMap {
      case pNode if (pNode \\ "PLAYER" \\ "NAME").head.text == "ALONSO" =>
        (pNode \\ "PLAYER" \\ "SALARY").headOption.map(_.text)
      case _ => None
    }.headOption
 
 // result   
 salary

这似乎返回了 XML 中的第一笔薪水 - 这不是我需要的! 任何帮助将不胜感激!

xml scala xslt xml 解析 SAX

评论


答:

0赞 Johny T Koshy 10/9/2022 #1

在当前代码中,您正在检查 的第一个节点是否包含 .因此,如果您更改顺序并创建第一个玩家的名字,例如,您将得到一个空列表。Elem"ALONSO""Rooney"

相反,您可以尝试,

players.child.flatMap {
  case pNode if (pNode \\ "PLAYER" \\ "NAME").text == "ALONSO" =>
    (pNode \\ "PLAYER" \\ "SALARY").headOption.map(_.text)
  case _ => None
}
1赞 michael.hor257k 10/9/2022 #2

由于您将问题标记为 ,下面是一个 XSLT 答案:xslt

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:template match="/PLAYERS">
    <xsl:value-of select="PLAYER[NAME='ALONSO' and POSITION='STRIKER']/SALARY"/>
</xsl:template>

</xsl:stylesheet>

评论

0赞 kajoe14 10/10/2022
希望有一个与 Scala 相关的解决方案 - 感谢您的输入!