xml - 在TCL tDOM中解析具有多个子项的XML数据

标签 xml xpath tcl tdom

我的XML文件:

<?xml version="1.0"?>
<root>
<msg>
    <MessageError>
        <BookingID>123</BookingID>
        <Error>Invalid patient name</Error>
        <Error>PATIENT NOT FOUND</Error>
        <Message>Incoming MESSAGE DATA 1</Message>
    </MessageError>
    <MessageError>
        <BookingID>456</BookingID>
        <Error>Undefined patient account number.</Error>
        <Error>Undefined Account Number</Error>
        <Message>Incoming MESSAGE DATA 2</Message>
    </MessageError>
    <MessageError>
        <BookingID>789</BookingID>
        <Error>DOB invalid</Error>
        <Message>Incoming MESSAGE DATA 3</Message>
    </MessageError>
</msg>
</root>


我的tcl脚本:

        set dom [dom parse $msg]
        set root [$dom documentElement]         

        set MessageError [$root selectNodes "/root/msg/MessageError" ]
        foreach node $MessageError {
            set Error [$root selectNodes {/root/msg/MessageError/Error} ]
            #set bookingid [$MessageError text]
            #echo "BookingIDXML - $bookingid"
            #set message [$MessageError text]
            #echo "MessageXML - $message"

            foreach errornode $Error {
                set error [$errornode text]
                echo "ErrorXML - $error"
            }
        }


我的输出:

ErrorXML - Invalid patient name
ErrorXML - PATIENT NOT FOUND
ErrorXML - Undefined patient account number.
ErrorXML - Undefined Account Number
ErrorXML - DOB invalid
ErrorXML - Invalid patient name
ErrorXML - PATIENT NOT FOUND
ErrorXML - Undefined patient account number.
ErrorXML - Undefined Account Number
ErrorXML - DOB invalid
ErrorXML - Invalid patient name
ErrorXML - PATIENT NOT FOUND
ErrorXML - Undefined patient account number.
ErrorXML - Undefined Account Number
ErrorXML - DOB invalid


互联网上缺少此功能强大的工具的文档。如何获得输出?我的代码中带注释的“#”部分无效。

BookingIDXML - 123
ErrorXML - Invalid patient name
MessageXML - Incoming MESSAGE DATA 1

BookingIDXML - 123
ErrorXML - PATIENT NOT FOUND
MessageXML - Incoming MESSAGE DATA 1

BookingIDXML - 456
ErrorXML - Undefined patient account number.
MessageXML - Incoming MESSAGE DATA 2

BookingIDXML - 465
ErrorXML - Undefined Account Number
MessageXML - Incoming MESSAGE DATA 2

BookingIDXML - 789
ErrorXML - DOB invalid
MessageXML - Incoming MESSAGE DATA 3


提前致谢。

最佳答案

selectNodes方法使用XPath(有据可查)来查找要返回的结果,上下文节点是调用该方法的对象。因此,要查找特定ErrorMessageError节点,必须从正确的位置开始。特别是,您可能希望代码执行以下操作:

foreach messageError [$root selectNodes "/root/msg/MessageError"] {
    # Print some general info (to separate error groups)
    set bookingID [lindex [$messageError selectNodes "BookingID"] 0]
    puts "ID: [$bookingID text]"
    set message [lindex [$messageError selectNodes "Message"] 0]
    puts "Message: [$message text]"
    # Print the errors
    foreach error [$messageError selectNodes "Error"] {
        puts "Error: [$error text]"
    }
}


如果愿意,可以使用./Error而不是Error作为XPath搜索术语。效果是一样的,但看起来有点像一条路径。您不应该做的是从文档的根开始搜索(就像/root/msg/MessageError/Error那样),因为然后您会找到与该路径匹配的所有内容,而不仅是当前子上下文中的位。 (认为​​子上下文有点像文件系统中的当前目录,而元素有点像目录;这只是部分类比-DOM树不是目录,但还是有点类比。)

关于xml - 在TCL tDOM中解析具有多个子项的XML数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16234178/

相关文章:

java - xsd:在Java类中是唯一的

java - 如何使用 XPath 通过另一个属性的值过滤元素?

xml - 如何获取指定元素之前的下一个 sibling

python - 我可以使用 Tkinter 创建 Tcl 交互式 shell 吗?

python - 如何将 Tcl/Tk 的 ActiveState 分发链接到 HomeBrew 安装的 Python

java - JAXB 不为 List 创建 set 方法

xml - Builder gem 中的命名空间属性

java - android.net.VPNServicec 不是封闭类

sql-server - TSQL Xpath 修改 XML 字符串

javascript - 通过 Ajax 获取服务器时间 - 我的代码有什么问题?