【问题标题】:TCL: how do I split an XML file by tagTCL:如何按标签拆分 XML 文件
【发布时间】:2018-04-19 21:17:09
【问题描述】:

我有一个具有以下结构的 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>

我需要编辑每个资源的信息,所以我尝试通过字符串 &lt;/resource&gt; 拆分文件,但 TCL 没有正确拆分它。

这是我尝试过的:split $file "&lt;/resource&gt;"。我还尝试转义 字符,但仍然没有成功。

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

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

谢谢

【问题讨论】:

  • 您是否在[xml][tcl] 上搜索过以前的答案?这已经被报道过无数次了。
  • 这听起来像是一个 XY 问题:你到底想做什么?
  • @mrcalvin 是的,我已经搜索过了,但我没有找到这个答案; @"glenn jackman" 我的 XML 中有一些标签,我需要修改这些标签,但我需要分离资源,因为我可能会修改错误的资源
  • XML 很难在不破坏结构的情况下作为文本进行编辑。最简单的部分是找到要编辑的地方并在那里进行更改。更难的部分是确保您在编辑后保存回文件的内容仍然是有效的 XML,其中除了您的编辑内容没有任何变化。 (这适用于任何语言,而不仅仅是 Tcl。)

标签: xml string file split tcl


【解决方案1】:

建议

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

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

评论

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

【讨论】:

  • 是的,你是对的,tdom被覆盖了多次只是我不能使用tdom,所以我正在寻找另一种解决方案
  • 为什么不能使用tdom?你会留下regexpregsub,但这不会让你走得太远(取决于文档结构和你所追求的)。在说“我不能使用 tdom”之前,你应该先诉诸:“我不能使用 XML,给我另一种格式。”
  • 因为我没有运行原生TCL,而且我运行的TCL不支持tdom。
  • 好吧,那怎么样:stackoverflow.com/questions/49326362/…
  • 不过,请注意,这不会让您走得太远。最好花时间获取带有 tdom 的 Tcl 或非 XML 格式的数据。
【解决方案2】:

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

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

其次,您没有描述要以何种方式编辑节点。两种明显的方法是添加新的属性值和添加新的子节点。这是您可以根据guid 属性的值选择使用tdom 执行每个操作的方法:

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"
        }
    }
}

如果您希望添加比子节点更复杂的内容,有多种方法可以实现,包括使用节点命令、附加 XML 文字、通过脚本附加(在进行多个类似添加时最有用),以及附加一个嵌套的 Tcl 列表,描述具有属性的节点结构。

然后您可以通过调用$doc asXML 将编辑后的 ​​DOM 结构作为 XML 获取。

【讨论】:

  • 您可以使用[$node @guid] 作为getAttribute 方法的(非常方便的)快捷方式。
  • 感谢您抽出宝贵时间回答我的问题 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多