Xml Postgresql查询以选择bytea字段中的输入键

Xml Postgresql查询以选择bytea字段中的输入键,xml,postgresql,bytea,Xml,Postgresql,Bytea,我正在使用Postgresql数据库。 表is ticketlines包含一个名为attributes的bytea字段 JSON视图中的字段内容示例: <?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd

我正在使用Postgresql数据库。 表is ticketlines包含一个名为attributes的bytea字段

JSON视图中的字段内容示例:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
    <comment>Ticket Attributes</comment>
    <entry key="product.candiscount">true</entry>
    <entry key="product.categoryid">8410a5e3-fc31-4370-b7da-d8406d80ca97</entry>
    <entry key="product.kitchen">false</entry>
    <entry key="product.com">false</entry>
    <entry key="product.alwaysavailable">false</entry>
    <entry key="product.service">true</entry>
    <entry key="product.warranty">false</entry>
    <entry key="product.taxcategoryid">000</entry>
    <entry key="product.vprice">false</entry>
    <entry key="product.discounted">no</entry>
    <entry key="notes">006942</entry>
    <entry key="product.texttip"/>
    <entry key="product.nosc">0</entry>
    <entry key="product.promotionadded">false</entry>
    <entry key="product.name">Pawn Payout</entry>
    <entry key="product.code">pp</entry>
    <entry key="product.ispack">false</entry>
    <entry key="product.alias"/>
    <entry key="product.verpatrib">false</entry>
    <entry key="product.managestock">true</entry>
    </properties>

票证属性
真的
8410a5e3-fc31-4370-b7da-d8406d80ca97
假的
假的
假的
真的
假的
000
假的
不
006942
0
假的
典当支出
聚丙烯
假的
假的
真的
是否有一种简单的方法来查询这些数据,以便在SELECT语句(即SELECT product.name、notes)中进行报告

我很接近这一点:但很明显,我的结构是错误的: 从ticketline中选择xpath('//properties:notes/text()',CAST(将_从(属性,'UTF-8')转换为XML),其中ticket='7abc41d9-0d7f-4187-bb81-e4139d7728bf'

结果是:
错误:无效的XML内容详细信息:第2行:StartTag:无效的元素名称^***错误***错误:无效的XML内容SQL状态:2200N详细信息:第2行:StartTag:无效的元素名称

我确实根据您编写的内容重新创建了表,并成功地执行了此查询:

SELECT xpath('/properties/entry[@key=''notes'']/text()', CAST(convert_from(attributes, 'UTF-8') AS XML)) AS result FROM ticketlines where ticket  =1;

虽然我没有用你的查询重现你的错误信息。请检查您的DB表中票证7abc41d9-0d7f-4187-bb81-e4139d7728bf的真实内容。

我确实根据您编写的内容重新创建了您的表,并成功完成了此查询:

SELECT xpath('/properties/entry[@key=''notes'']/text()', CAST(convert_from(attributes, 'UTF-8') AS XML)) AS result FROM ticketlines where ticket  =1;

虽然我没有用你的查询重现你的错误信息。请检查DB表中票证7abc41d9-0d7f-4187-bb81-e4139d7728bf的真实内容是什么。

看起来bytea的
内容不是正确的XML-查看
转换结果

使用问题中显示的XML,正确的XPath查询应该是

SELECT xpath('//entry[@key=''notes'']/text()', xml) FROM ...

这将得到“entry”元素的内容,其中“key”属性的值是
notes

看起来
bytea
的内容不是正确的XML-查看
convert\u from
结果

使用问题中显示的XML,正确的XPath查询应该是

SELECT xpath('//entry[@key=''notes'']/text()', xml) FROM ...


这将得到“entry”元素的内容,其中“key”属性的值是
notes

“JSON”是一个打字错误吗?在我看来像XML。它来自pglobeditor.exe,XML、json和文本模式都是这样。该应用程序在Java中运行,我假设JSON就是它的实现方式。XML、JSON和文本有很大的不同。这部分文本只是显示bytea字段的内容,目的是有人帮助查询字段外的数据,不想争论XML、text、Jason之间的布局差异,不管怎样,答案是响亮的“不”。如果数据的结构未指定,您不能期望能够从中提取元素。“JSON”是一个拼写错误吗?在我看来像XML。它来自pglobeditor.exe,XML、json和文本模式都是这样。该应用程序在Java中运行,我假设JSON就是它的实现方式。XML、JSON和文本有很大的不同。这部分文本只是显示bytea字段的内容,目的是有人帮助查询字段外的数据,不想争论XML、text、Jason之间的布局差异,不管怎样,答案是响亮的“不”。如果未指定数据的结构,则无法从中提取元素。谢谢。仍然不行。我以如下方式运行查询:选择xpath('/properties/entry[@key=''notes']/text()',从ticketlines转换为XML,其中ticket='7abc41d9-0d7f-4187-bb81-e4139d7728bf';结果:错误:无效的XML内容详细信息:第2行:StartTag:无效的元素名称^*********错误*********错误:无效的XML内容SQL状态:2200N详细信息:第2行:StartTag:无效的元素名称您使用的Postgres版本是什么?我的是11.5分。您可以通过选择版本()进行检查;在SQL中,当有疑问时。快速的互联网搜索会产生一篇2010年的帖子,在Postgres中出现了类似的DOCTYPE问题。9.4.5版同样,这里有一个链接指向该表的备份:你的Postgres 9.4.5版已经过时了。如果我将docker容器降级为postgres:9.4.5映像,我可以复制您的错误消息,否则我无法复制。谢谢。我将努力迁移到新版本。谢谢。仍然不行。我以如下方式运行查询:选择xpath('/properties/entry[@key=''notes']/text()',从ticketlines转换为XML,其中ticket='7abc41d9-0d7f-4187-bb81-e4139d7728bf';结果:错误:无效的XML内容详细信息:第2行:StartTag:无效的元素名称^*********错误*********错误:无效的XML内容SQL状态:2200N详细信息:第2行:StartTag:无效的元素名称您使用的Postgres版本是什么?我的是11.5分。您可以通过选择版本()进行检查;在SQL中,当有疑问时。快速的互联网搜索会产生一篇2010年的帖子,在Postgres中出现了类似的DOCTYPE问题。9.4.5版同样,这里有一个链接指向该表的备份:你的Postgres 9.4.5版已经过时了。如果我将docker容器降级为postgres:9.4.5映像,我可以复制您的错误消息,否则我无法复制。谢谢。我将努力迁移到新版本。