XML 到 JSON:如何在转换为 JSON 后重建节点顺序
XML to JSON: How to reconstruct the order of nodes after conversion to JSON
我目前正在使用 eXist-db 作为 XML/TEI 数据库,Angular 用于创建网站。 Angular 代码正在从 eXist-db 请求数据,我选择让 eXist-db 响应 JSON。我一直假设 JSON 是最适合这项任务的数据格式。
我使用以下 XQuery 代码从 eXist-db 中的固定 XML 文件创建 JSON(我目前只是 starting/testing 所有这些):
xquery version "3.0";
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
declare option output:method "json";
declare option output:media-type "application/json";
let $doc := doc("/db/data/Drucktexte/playground/Test_Angular_ngFor.xml")
return
<result>{$doc}</result>
我的问题:在XML中有例如
基本上包含文本的节点。
节点的文本内容中可能还嵌入了其他子节点。在XML中,文本和其他节点的顺序是连续的,因此清晰。
下面显示了一些 XML 有两个
节点。这两个
节点之间的唯一区别是它们的子节点的顺序 - 例如 的外观:
<TEI>
<p n="1">The first text fragment
<app>The first app fragment</app>
The second text fragment
<app>The second app fragment</app>
The third text fragment
<pagebreak/>
The fourth text fragment
<app>The third app fragment</app>
</p>
<p n="2">The first text fragment
<app>The first app fragment</app>
The second text fragment
<pagebreak/>
The third text fragment
<app>The second app fragment</app>
The fourth text fragment
<app>The third app fragment</app>
</p>
当 XML 转换为 JSON 时,我得到相同节点类型的孤立数组。我目前看不出如何恢复这些数组元素的正确顺序以在网站上以正确的顺序显示所有这些 elements/nodes。上面的XML转成JSON后,两个
节点看起来完全一样:
[
{
"@n": "1",
"#text": [
"The first text fragment",
"The second text fragment",
"The third text fragment",
"The fourth text fragment"
],
"app": [
"The first app fragment",
"The second app fragment",
"The third app fragment"
],
"pagebreak": []
},
{
"@n": "2",
"#text": [
"The first text fragment",
"The second text fragment",
"The third text fragment",
"The fourth text fragment"
],
"app": [
"The first app fragment",
"The second app fragment",
"The third app fragment"
],
"pagebreak": []
}]
我目前无法找出分页节点必须插入到每个
中的哪个文本片段之后。我对这个 XML 到 JSON 的问题做了一些研究,但找不到任何有用的东西。另一方面,我无法想象我是第一个遇到这样问题的人。
我正在考虑向 JSON 添加一些数据来表示所有节点和子节点的结构,但我想必须有更优雅的方法。
非常感谢您的帮助。提前致谢。
您的代码使用某种特定于 eXist 的方法将任意 XML 转换为 JSON 节点,记录在此处:https://exist-db.org/exist/apps/wiki/blogs/eXist/JSONSerializer。 (在 XQuery 工作组在 XQuery 3.1 中添加完全 JSON 支持之前,eXist 并不是唯一一个开发了用于生成 JSON 的工具的 XQuery 实现。)虽然这种转换做得很好,但它可能不是正是您的用例所需要的。
幸运的是,eXist 确实支持 XQuery 3.1's standard, built-in capabilities for parsing and serializing JSON。这意味着您可以编写生成 JSON 的 XQuery,保留节点的顺序,并在此过程中执行任何其他自定义行为。
有关保留节点顺序的 XML 到 JSON 转换的两个示例,请参阅:
- 将您的 XML 完全自定义但冗长地转换为 JSON:https://xqueryfiddle.liberty-development.net/pPgCcoF
- 将您的 XML 更紧凑地转换为 JsonML:https://xqueryfiddle.liberty-development.net/bdxtpA。
我目前正在使用 eXist-db 作为 XML/TEI 数据库,Angular 用于创建网站。 Angular 代码正在从 eXist-db 请求数据,我选择让 eXist-db 响应 JSON。我一直假设 JSON 是最适合这项任务的数据格式。
我使用以下 XQuery 代码从 eXist-db 中的固定 XML 文件创建 JSON(我目前只是 starting/testing 所有这些):
xquery version "3.0";
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
declare option output:method "json";
declare option output:media-type "application/json";
let $doc := doc("/db/data/Drucktexte/playground/Test_Angular_ngFor.xml")
return
<result>{$doc}</result>
我的问题:在XML中有例如
基本上包含文本的节点。
节点的文本内容中可能还嵌入了其他子节点。在XML中,文本和其他节点的顺序是连续的,因此清晰。
下面显示了一些 XML 有两个
节点。这两个
节点之间的唯一区别是它们的子节点的顺序 - 例如
<TEI>
<p n="1">The first text fragment
<app>The first app fragment</app>
The second text fragment
<app>The second app fragment</app>
The third text fragment
<pagebreak/>
The fourth text fragment
<app>The third app fragment</app>
</p>
<p n="2">The first text fragment
<app>The first app fragment</app>
The second text fragment
<pagebreak/>
The third text fragment
<app>The second app fragment</app>
The fourth text fragment
<app>The third app fragment</app>
</p>
当 XML 转换为 JSON 时,我得到相同节点类型的孤立数组。我目前看不出如何恢复这些数组元素的正确顺序以在网站上以正确的顺序显示所有这些 elements/nodes。上面的XML转成JSON后,两个
节点看起来完全一样:
[
{
"@n": "1",
"#text": [
"The first text fragment",
"The second text fragment",
"The third text fragment",
"The fourth text fragment"
],
"app": [
"The first app fragment",
"The second app fragment",
"The third app fragment"
],
"pagebreak": []
},
{
"@n": "2",
"#text": [
"The first text fragment",
"The second text fragment",
"The third text fragment",
"The fourth text fragment"
],
"app": [
"The first app fragment",
"The second app fragment",
"The third app fragment"
],
"pagebreak": []
}]
我目前无法找出分页节点必须插入到每个
中的哪个文本片段之后。我对这个 XML 到 JSON 的问题做了一些研究,但找不到任何有用的东西。另一方面,我无法想象我是第一个遇到这样问题的人。
我正在考虑向 JSON 添加一些数据来表示所有节点和子节点的结构,但我想必须有更优雅的方法。
非常感谢您的帮助。提前致谢。
您的代码使用某种特定于 eXist 的方法将任意 XML 转换为 JSON 节点,记录在此处:https://exist-db.org/exist/apps/wiki/blogs/eXist/JSONSerializer。 (在 XQuery 工作组在 XQuery 3.1 中添加完全 JSON 支持之前,eXist 并不是唯一一个开发了用于生成 JSON 的工具的 XQuery 实现。)虽然这种转换做得很好,但它可能不是正是您的用例所需要的。
幸运的是,eXist 确实支持 XQuery 3.1's standard, built-in capabilities for parsing and serializing JSON。这意味着您可以编写生成 JSON 的 XQuery,保留节点的顺序,并在此过程中执行任何其他自定义行为。
有关保留节点顺序的 XML 到 JSON 转换的两个示例,请参阅:
- 将您的 XML 完全自定义但冗长地转换为 JSON:https://xqueryfiddle.liberty-development.net/pPgCcoF
- 将您的 XML 更紧凑地转换为 JsonML:https://xqueryfiddle.liberty-development.net/bdxtpA。