Go xml文件处理

Python011

Go xml文件处理,第1张

在开发中会常遇到xml数据序列化和反序列化,这里我们介绍go语言处理xml数据。 “encoding/xml” 包实现了一个简单的xml 1.0解析器,可以理解xml名称空间。

示例:

示例:

https://studygolang.com/pkgdoc

在go语言中 new() 这是一个用来分配内存的内置函数,它的第一个参数是一个类型,不是一个值,它的返回值是一个指向新分配的 t 类型的零值的指针。 在golang的代码定义如下: func new(t Type) *Type strut{} 直接使用struct{} 来初始化strut时,...

XML 解析

XML 解析是将 XML 数据从其序列化字符串格式转换为分层格式的过程。

可以让 DB2® 数据库管理器隐式执行解析,也可以显式执行 XML 解析。

在下列情况下进行隐式 XML 解析:

使用类型为 XML 的主变量或使用类型为 XML 的参数标记将数据传递至数据库服务器时

数据库服务器在绑定主变量或参数标记的值以便在语句处理期间使用时进行解析

在这种情况下,必须使用隐式解析。

在 INSERT、UPDATE、DELETE 或 MERGE 语句中将字符串数据类型(character、graphic 或 binary)的主变量、参数标记或 SQL 表达式指定给 XML 列时。当 SQL 编译器隐式将 XMLPARSE 函数添加至该语句时进行解析。

对输入 XML 数据调用 XMLPARSE 函数时,执行显式 XML 解析。可以在接受 XML 数据类型的任何上下文中使用 XMLPARSE 的结果。例如,可以将结果指定给 XML 列或将它用作类型为 XML 的存储过程参数。

XMLPARSE 函数采用非 XML、字符或二进制数据类型作为输入。对于嵌入式动态 SQL 应用程序,需要将表示 XMLPARSE 的输入文档的参数标记强制类型转换为相应的数据类型。例如:

INSERT INTO MyCustomer (Cid, Info)

VALUES (?, xmlparse(document cast(? as clob(1k)) preserve whitespace))

对于静态嵌入式 SQL 应用程序,不能将 XMLPARSE 函数的主变量自变量声明为 XML 类型(XML AS BLOB、XML AS CLOB 或 XML AS DBCLOB 类型)。

XML 解析和空格处理

在隐式或显式 XML 解析期间,将数据存储在数据库中时,可以控制是保留还是去掉边界空格字符。

根据 XML 标准,空格是文档中用于提高可读性的间隔字符(U+0020)、回车符(U+000D)、换行符(U+000A)或制表符(U+0009)。当任何这些字符作为文本字符串的一部分出现时,不将它们视为空格。

边界空格是出现在元素之间的空格字符。例如,在以下文档中,<a>与 <b>以及 </b>与 </a>之间的空格是边界空格。

<a><b>and between </b></a>

通过显式调用 XMLPARSE,可以使用 STRIP WHITESPACE 或 PRESERVE WHITESPACE 选项来控制是否保留边界空格。缺省行为是去掉边界空格。

通过隐式 XML 解析:

如果输入数据类型不是 XML 类型或未强制类型转换为 XML 数据类型,则 DB2 数据库管理器总是去掉空格。

如果输入数据类型是 XML 数据类型,则可以使用 CURRENT IMPLICIT XMLPARSE OPTION 专用寄存器来控制是否保留边界空格。可以将此专用寄存器设置为 STRIP WHITESPACE 或 PRESERVE WHITESPACE。缺省行为是去掉边界空格。

如果使用 XML 验证,则 DB2 数据库管理器将忽略 CURRENT IMPLICIT XMLPARSE OPTION 专用寄存器,并只使用验证规则来确定下列示例中是去掉还是保留空格:

xmlvalidate(? ACCORDING TO XMLSCHEMA ID schemaname)

xmlvalidate(?)

xmlvalidate(:hvxml ACCORDING TO XMLSCHEMA ID schemaname)

xmlvalidate(:hvxml)

xmlvalidate(cast(? as xml) ACCORDING TO XMLSCHEMA ID schemaname)

xmlvalidate(cast(? as xml))

在这些示例中,? 表示 XML 数据,而 :hvxml 是 XML 主变量。

有关 XML 验证如何影响空格处理方式的信息,请参阅 XML 验证。

XML 标准指定 xml:space 属性,它用于控制是去掉还是保留 XML 数据中的空格。xml:space 属性覆盖任何空格设置以进行隐式或显式 XML 解析。

例如,在以下文档中,无论 XML 解析选项如何,总是保留正好在 <b>前后的空格,因为这些空格位于具有属性 xml:space="preserve" 的节点内:

<a xml:space="preserve"><b><c>c</c>b </b></a>

但是,在以下文档中,可以用 XML 解析选项控制正好在 <b>前后的空格,因为这些空格位于具有属性 xml:space="default" 的节点内:

<a xml:space="default"><b><c>c</c>b </b></a>

XML 解析和 DTD

如果输入数据包含内部文档类型声明(DTD)或引用外部 DTD,则 XML 解析过程还会检查这些 DTD 的语法。此外,解析过程还:

应用内部和外部 DTD 定义的缺省值

扩展实体引用和参数实体

示例:文件 c8.xml 包含以下文档:

<customerinfo xml:space="preserve" xmlns="http://posample.org" Cid='1008'>

<name>Kathy Smith</name>

<addr country='Canada'>

<street>14 Rosewood</street>

<city>Toronto</city>

<prov-state>Ontario</prov-state>

<pcode-zip>M6W 1E6</pcode-zip>

</addr>

<phone type='work'>416-555-3333</phone>

</customerinfo>

在 JDBC 应用程序中,从文件中读取 XML 文档,并将数据插入到表 MyCustomer(它是样本 Customer 表的副本)的 XML 列 Info 中。让 DB2 数据库服务器执行隐式 XML 解析操作。

PreparedStatement insertStmt = null

String sqls = null

int cid = 1008

sqls = "INSERT INTO MyCustomer (Cid, Info) VALUES (?, ?)"

insertStmt = conn.prepareStatement(sqls)

insertStmt.setInt(1, cid)

File file = new File("c8.xml")

insertStmt.setBinaryStream(2, new FileInputStream(file), (int)file.length())

insertStmt.executeUpdate()

未指定空格处理方式,因此采用缺省行为:去掉空格。但是,文档包含 xml:space="preserve" 属性,因此保留空格。这表示将保留文档中元素之间的回车符、换行符和空格。

如果检索存储的数据,则内容看起来如下所示:

<customerinfo xml:space="preserve" xmlns="http://posample.org" Cid='1008'>

<name>Kathy Smith</name>

<addr country='Canada'>

<street>14 Rosewood</street>

<city>Toronto</city>

<prov-state>Ontario</prov-state>

<pcode-zip>M6W 1E6</pcode-zip>

</addr>

<phone type='work'>416-555-3333</phone>

</customerinfo>

示例:假定以下文档位于 BLOB 主变量 blob_hostvar 中。

<customerinfo xml:space="default" xmlns="http://posample.org" Cid='1009'>

<name>Kathy Smith</name>

<addr country='Canada'>

<street>15 Rosewood</street>

<city>Toronto</city>

<prov-state>Ontario</prov-state>

<pcode-zip>M6W 1E6</pcode-zip>

</addr>

<phone type='work'>416-555-4444</phone>

</customerinfo>

在静态嵌入式 C 应用程序中,将主变量中的文档插入到表 MyCustomer 的 XML 列 Info 中。该主变量不是 XML 类型,因此需要显式执行 XMLPARSE。指定 STRIP WHITESPACE 以除去任何边界空格。

EXEC SQL BEGIN DECLARE SECTION

SQL TYPE BLOB (10K) blob_hostvar

EXEC SQL END DECLARE SECTION

...

EXEC SQL INSERT INTO MyCustomer (Cid, Info)

VALUES (1009,

XMLPARSE(DOCUMENT :blob_hostvar STRIP WHITESPACE))

文档包含 xml:space="default" 属性,因此指定了 STRIP WHITESPACE 的 XMLPARSE 将控制空格处理方式。这表示将除去文档中元素之间的回车符、换行符和空格。

如果检索存储的数据,则您将看到具有以下内容的单个行:

<customerinfo xml:space="default" xmlns="http://posample.org" Cid='1009'>

<name>Kathy Smith</name><addr country='Canada'><street>15 Rosewood</street>

<city>Toronto</city><prov-state>Ontario</prov-state><pcode-zip>M6W 1E6</pcode-zip>

</addr><phone type='work'>416-555-4444</phone></customerinfo>

示例:在 C 语言应用程序中,主变量 clob_hostvar 包含以下文档,该文档包含内部 DTD:

<!DOCTYPE prod [<!ELEMENT description (name,details,price,weight)>

<!ELEMENT name (#PCDATA)>

<!ELEMENT details (#PCDATA)>

<!ELEMENT price (#PCDATA)>

<!ELEMENT weight (#PCDATA)>

<!ENTITY desc "Anvil">

]>

<product xmlns="http://posample.org" pid=''110-100-01'' >

<description>

<name>&desc</name>

<details>Very heavy</details>

<price>9.99</price>

<weight>1 kg</weight>

</description>

</product>'

将数据插入到表 MyProduct 中,它是样本 Product 表的副本:

EXEC SQL BEGIN DECLARE SECTION

SQL TYPE CLOB (10K) clob_hostvar

EXEC SQL END DECLARE SECTION

...

EXEC SQL insert into

Product ( pid, name, Price, PromoPrice, PromoStart, PromoEnd, description )

values ( '110-100-01','Anvil', 9.99, 7.99, '11-02-2004','12-02-2004',

XMLPARSE ( DOCUMENT :clob_hostvar STRIP WHITESPACE ))

XMLPARSE 指定去掉空格,因此将除去文档内的边界空格。此外,在数据库服务器执行 XMLPARSE 时,它将实体引用 &desc替换为它的值。

如果检索存储的数据,则您将看到具有以下内容的单个行:

<product xmlns="http://posample.org" pid="110-100-01"><description><name>Anvil

</name><details>Very heavy</details><price>9.99</price>

<weight>1 kg</weight></description></product>