在Scala XML中更新节点属性

时间:2015-09-12 06:57:50

标签: xml scala scala-xml

我有一个我想要更新的xml文档,并且我使用递归函数循环遍历节点。但是,我在更新节点属性时遇到了问题。 我想隐藏用户的所有路径并用密钥替换它们。这是我到目前为止所得到的

XML文档示例:

<html>
    <head>
      <title>my document</title>
      <link rel="stylesheet" href="/styles/style.css"/>
    </head>
    <body>
      <a href="link1"></a>
      <img src="link2"/>
      <img src="link3"/>
      <img src="link1"/>
      <a href="link5"></a>
    </body>
  </html>

通过我的递归函数传递,然后调用updateNode函数来更新它

def processNode(n: Node){
    if(n.label == "a") {
          updateNode(n, "href")
      }
    }
    n.child foreach processNode
  }

def updateNode(n: Node, att: String) {
val k: Int = getKey(n.attribute(att).get.toString)   
if (k == c){ // if k == c then key does not exists
  list += (c -> n.attribute(att).get.toString())
  // update node
  c = c + 1
} else {
  // update node
}}

我已经测试了.attributes.remove和.attributes.append,但它们似乎无法正常工作。 我假设我可能需要使用.copy但节点数据类型没有.copy .. Elem

1 个答案:

答案 0 :(得分:0)

我知道你正在使用SAX解析器将XML文档解析到内存中!那是一个解析器/阅读器。如果你想在堆上修改加载的XML树对象图(即以更复杂的方式逐步从节点添加属性),以便你想要将它写回磁盘或在修改后通过网络发送它树结构然后你可以使用JAXB库。

如果您不想花时间而只需要更改一个属性来修复树,那么您可以继续使用SAX解析器,但是您需要临时保存并将文件(DataStream)写回字符串/来自字符串缓冲区的文本。