如何在 Oracle 中解析 XML
How to parse XML in Oracle
我有以下 SQL 服务器查询,我必须将其转换为 Oracle:
Select PhotoNumber, cast(cast(cast( PhotoInfo as varbinary(max)) as varchar(max)) as XML).value('(/DataIM/PhotoChosen/Photo/jpg)[1]', 'varchar(max)') as PhotoInfo
From ProfilePictures
Where photosourcetype = 10
我把它转换成Oracle如下
Select PhotoNumber, extract(xmltype(photoinfo,1), '(/DataIM/PhotoChosen/Photo/jpg)[1]') "photoinfo"
From ProfilePictures
Where photosourcetype = 10
/DataIM/PhotoChosen/Photo/jpg)[1]
中出现无效标记错误
如何解析我的 XML?我只想要字符串中的详细信息。
您所展示的带有平衡括号的内容有效:
Select PhotoNumber, extract(xmltype(photoinfo,1), '(/DataIM/PhotoChosen/Photo/jpg)[1]') "photoinfo"
From ProfilePictures
Where photosourcetype = 10
PHOTONUMBER | photoinfo
----------- | -----------------------
42 | <jpg>my_photo.jpg</jpg>
尽管我不确定括号的作用,但没有括号也能正常工作。您可能只需要实际的字符串,而不是 jpg
节点及其内容;因此您可以将 /text()
添加到 XPath 中以获取它。
但 extract
已弃用,因此最好使用 XML 查询:
Select PhotoNumber,
XMLQuery(
'/DataIM/PhotoChosen/Photo/jpg[1]/text()'
passing xmltype(photoinfo, 1)
returning content
).getstringval() "photoinfo"
From ProfilePictures
Where photosourcetype = 10
PHOTONUMBER | photoinfo
----------- | ------------
42 | my_photo.jpg
我保留了你的 quoted identifier,但我建议你避免使用这些,除非真的有必要。
您正在使用字符集标识符 1 将 BLOB 转换为 XML。希望这是正确的,也是您想要的。你可以看到实际上是哪个字符集:
select nls_charset_name(1) from dual;
在我的系统上报告为 US7ASCII,我怀疑到处都是旧的默认值。
传递 0 改为使用数据库字符集。不过,您需要知道 BLOB 数据使用的字符集。如果您知道可以查找要使用的正确号码,例如:
select nls_charset_id('UTF8') from dual;
或者直接在xmltype()
调用中传入:
...
passing xmltype(photoinfo, nls_charset_id('UTF8'))
...
我有以下 SQL 服务器查询,我必须将其转换为 Oracle:
Select PhotoNumber, cast(cast(cast( PhotoInfo as varbinary(max)) as varchar(max)) as XML).value('(/DataIM/PhotoChosen/Photo/jpg)[1]', 'varchar(max)') as PhotoInfo
From ProfilePictures
Where photosourcetype = 10
我把它转换成Oracle如下
Select PhotoNumber, extract(xmltype(photoinfo,1), '(/DataIM/PhotoChosen/Photo/jpg)[1]') "photoinfo"
From ProfilePictures
Where photosourcetype = 10
/DataIM/PhotoChosen/Photo/jpg)[1]
中出现无效标记错误如何解析我的 XML?我只想要字符串中的详细信息。
您所展示的带有平衡括号的内容有效:
Select PhotoNumber, extract(xmltype(photoinfo,1), '(/DataIM/PhotoChosen/Photo/jpg)[1]') "photoinfo"
From ProfilePictures
Where photosourcetype = 10
PHOTONUMBER | photoinfo
----------- | -----------------------
42 | <jpg>my_photo.jpg</jpg>
尽管我不确定括号的作用,但没有括号也能正常工作。您可能只需要实际的字符串,而不是 jpg
节点及其内容;因此您可以将 /text()
添加到 XPath 中以获取它。
但 extract
已弃用,因此最好使用 XML 查询:
Select PhotoNumber,
XMLQuery(
'/DataIM/PhotoChosen/Photo/jpg[1]/text()'
passing xmltype(photoinfo, 1)
returning content
).getstringval() "photoinfo"
From ProfilePictures
Where photosourcetype = 10
PHOTONUMBER | photoinfo
----------- | ------------
42 | my_photo.jpg
我保留了你的 quoted identifier,但我建议你避免使用这些,除非真的有必要。
您正在使用字符集标识符 1 将 BLOB 转换为 XML。希望这是正确的,也是您想要的。你可以看到实际上是哪个字符集:
select nls_charset_name(1) from dual;
在我的系统上报告为 US7ASCII,我怀疑到处都是旧的默认值。
传递 0 改为使用数据库字符集。不过,您需要知道 BLOB 数据使用的字符集。如果您知道可以查找要使用的正确号码,例如:
select nls_charset_id('UTF8') from dual;
或者直接在xmltype()
调用中传入:
...
passing xmltype(photoinfo, nls_charset_id('UTF8'))
...