【问题标题】:do we have a TCL script to generate XML file?我们有生成 XML 文件的 TCL 脚本吗?
【发布时间】:2016-12-27 06:45:08
【问题描述】:

我使用 tcldom 制作了一个脚本:

package require utils
package require testrunscheduler
package require tdom
tla::TSConfig::init -schedulerContext "Reporting" -environment production
tla::TSDBFactory::getConnection db
set testCaseList [$db doSQL "SELECT root_name,suite_name,case_name FROM ics where test_type = 'tce' limit 1"]
set item [join $testCaseList ""]

set doc [dom createDocument testCases]
set root [$doc documentElement]
set subnode [$doc createElement testCase]
$root appendChild $subnode

foreach item $item {
set node [$doc createElement root]
$node appendChild [$doc createTextNode $item]
$subnode appendChild $node
}

我得到的输出是:

<testCases>
    <testCase>
        <root>SPB</root>
        <root>subscriberServices</root>
        <root>jmsServices</root>
    </testCase>
</testCases>

但我希望输出是这样的:

<testCases>
    <testCase>
        <root>SPB</root>
        <suite>subscriberServices</suite>
        <case>jmsServices</case>
    </testCase>
</testCases>

我为此使用了foreach,但它只用于root,我可能错过了,这个结构会自我迭代并随着用户从sql查询的输入而增长。

<testCases>
    <testCase>
        <root>demoRoot</root>
        <suite>demoSuite</suite>
        <case>demoCase</case>
        <testCase>test_demo001</testCase>
    </testCase>
    <testCase>
        <root>demoRoot</root>
        <suite>demoSuite</suite>
        <case>demoCase</case>
        <testCase>test_demo002</testCase>
    </testCase>
</testCases>

请帮助我获得这种输出,获得这种重复但具有一个结构的putput非常乏味。

【问题讨论】:

  • 看看 tdom 包,它非常适合这类任务。 wiki上有教程,搜索tdom。
  • 您查看的是哪个 wiki 页面?
  • Tdom 以另一种方式工作,即 XML 到原始或文本转换是我所理解的,还有另一个名为 xmlgen 的包,但该包未安装且不允许在我的测试环境中安装 @Peter
  • @vinay:tdom 实际上是双向的。我用它来解析 HTML/XML 和构建它。
  • @Peter Lewerin:是否有任何示例脚本可以帮助我获得您所说的使用 tdom 的输出?

标签: xml tcl itcl


【解决方案1】:
package require tdom

set data {
    {demoRoot1 demoSuite1 demoCase1}
    {demoRoot2 demoSuite2 demoCase2}
}

set doc [dom createDocument testCases]
set root [$doc documentElement]

dom createNodeCmd elementNode testCase
dom createNodeCmd elementNode root
dom createNodeCmd elementNode suite
dom createNodeCmd elementNode case
dom createNodeCmd textNode t

foreach line $data {
    lassign $line _root suite case
    # or (if you don't have lassign) foreach {_root suite case} $line break

    $root appendFromScript {
        testCase {
            root {t $_root}
            suite {t $suite}
            case {t $case}
            testCase {t [format {test_demo%03d} [incr num]]}
        }
    }
}

$doc asXML

输出:

<testCases>
    <testCase>
        <root>demoRoot1</root>
        <suite>demoSuite1</suite>
        <case>demoCase1</case>
        <testCase>test_demo001</testCase>
    </testCase>
    <testCase>
        <root>demoRoot2</root>
        <suite>demoSuite2</suite>
        <case>demoCase2</case>
        <testCase>test_demo002</testCase>
    </testCase>
</testCases>

有关更多示例,请参阅 wiki 上的教程。

文档: break, foreach, format, if, incr, lassign, package, set, tdom (package)

【讨论】:

  • 我已经重新格式化了问题,请帮我得到上面提到的输出
  • @vinay: 像这样?
  • 是的,有帮助,非常感谢..我不得不根据我的要求进行一些修改以创建 test_demo00#
  • 嘿,彼得,你能帮忙完成吗?我有另一个查询,但与此问题有关:stackoverflow.com/questions/18216742/…@Peter Lewerin
猜你喜欢
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多