在 scala 中查找没有子元素或值的 XML 元素

发布于 2024-11-08 06:03:07 字数 512 浏览 0 评论 0原文

考虑以下 XML:

val someXML =
<sammich>
  <bread>wheat</bread>
  <meat>salami</meat>
  <extras></extras>
  <condiments>
    <condiment expired="true">mayo</condiment>
    <condiment expired="false">mustard</condiment>
  </condiments>
</sammich>

我想找出哪个元素没有子元素,例如在上面的 XML 中,该元素为 extras。 NodeSeq 的 length 方法对于 extras 返回 1,isEmpty 返回 false。那么,我们如何测试这些没有任何子元素或值的元素呢?

请帮忙 谢谢

Consider the following XML :

val someXML =
<sammich>
  <bread>wheat</bread>
  <meat>salami</meat>
  <extras></extras>
  <condiments>
    <condiment expired="true">mayo</condiment>
    <condiment expired="false">mustard</condiment>
  </condiments>
</sammich>

I want to find out which element does not have subelements, like for example in the above XML that element would be extras. The length method of NodeSeq returns 1 for extras and isEmpty returns false. So, how can we test for such elements which dont have any sub elements or value ?

Please Help
Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

善良天后 2024-11-15 06:03:07

节点是长度为 1 且包含自身的列表。可以使用 descendant 检索子项,如果您询问,

someXML.descendant(7).descendant.length

您将得到 0(在您的示例中,位于位置 7(因为换行符) +空格也算作文本对象)。您可能也可能不希望计算属性:

someXML.descendant(7).attributes.length

Nodes are lists of length 1 containing themselves. Children can be retrieved with descendant If you ask

someXML.descendant(7).descendant.length

you'll get a 0 (in your example, <extras></extras> is at position 7 (since newlines+whitespace count as text objects). You may or may not also wish to count attributes:

someXML.descendant(7).attributes.length
任谁 2024-11-15 06:03:07

我将在雷克斯的回答中添加一些内容。请注意,descendant 方法包含注释和处理指令。假设您只想计算子元素和文本节点,则需要做更多的工作:

def isNodeEmpty(n: Node) = 
   n.descendant collect { case c @ (_: Text | _: Elem) => c } isEmpty

I'll just add a bit to Rex's answer. Note that the descendant method includes comments and processing instructions. Assuming you only want to count sub-elements and text nodes, you'll have to do a bit more work:

def isNodeEmpty(n: Node) = 
   n.descendant collect { case c @ (_: Text | _: Elem) => c } isEmpty
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文