TCL:如何按标记

时间:2018-04-19 21:17:10

标签: xml string file split tcl

我有一个XML文件,结构如下:

<?xml version="1.0" encoding="UTF-8"?>
  <header>
    <name>generic_1</name>
  </header>
  <body>
    <resources>
      <resource guid="ae8c34ad-a4e6-47fe-9b7d-cd60223754fe">
      </resource>
      <resource guid="fe236467-3df5-4019-9d55-d4881dfabae7">
      </resource>
    </resources>
  </body>

我需要编辑每个资源的信息,所以我尝试按字符串</resource>拆分文件,但TCL没有正确拆分它。

这就是我尝试过的:split $file "</resource>"。我也试过转义&lt;,/和&gt;人物,但仍然没有成功。

你能帮我找一个优雅的解决方案吗?我可以通过获取每一行并确定resource的结束位置来做到这一点,但split会更好,如果可以的话。

LE:我不能使用tdom,我将文件编辑为文本文件,而不是XML文件。

谢谢

2 个答案:

答案 0 :(得分:4)

建议

Tcl中的XML处理已在此处多次处理。通常建议您使用tdom和XPath表达式来导航DOM并提取数据:

package req tdom
set doc  [dom parse $xml]
set root [$doc documentElement]
$root selectNodes //resources/resource

注释

split基于每个字符分解字符串。 split的最后一个参数被解释为多个拆分字符,而不是一个拆分字符串。此外,它不会给你你想要的东西。

答案 1 :(得分:2)

这不是一个答案,只是对mrcalvin的答案的两个补充,放在这里用于格式化目的。

首先,您的XML无效,因为它缺少根元素(可能它已被删除)。

其次,您没有描述想要以何种方式编辑节点。两种显而易见的方法是添加新的属性值并添加新的子节点。根据{{​​1}}属性的值,您可以选择使用tdom执行每项操作:

guid

如果您希望添加比子节点更复杂的东西,有几种方法可以做到这一点,包括使用节点命令,附加XML文字,通过脚本追加(最常用的是添加几个类似的添加),以及附加一个嵌套的Tcl列表,用于描述具有属性的节点结构。

然后,您可以通过调用set nodes [$root selectNodes //resources/resource] foreach node $nodes { switch [$node getAttribute guid] { ae8c34ad-a4e6-47fe-9b7d-cd60223754fe { $node setAttribute foo bar } fe236467-3df5-4019-9d55-d4881dfabae7 { $node appendChild [$doc createElement quux] } default { error "unknown resource" } } } 将编辑后的DOM结构作为XML获取。