我有一个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文件。
谢谢
答案 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获取。