【问题标题】:Parsing XML in q (KX)在 q (KX) 中解析 XML
【发布时间】:2022-01-08 22:49:19
【问题描述】:

我正在尝试解析 q 中的 XML 文件。我能够展平文件,但进一步我无法提取结果。下面是数据集。

<breakfast_menu>
<food>
    <name>Belgian Waffles</name>
    <price>$5.95</price>
    <description>
   Two of our famous Belgian Waffles with plenty of real maple syrup
   </description>
    <calories>650</calories>
</food>
<food>
    <name>Strawberry Belgian Waffles</name>
    <price>$7.95</price>
    <description>
    Light Belgian waffles covered with strawberries and whipped cream
    </description>
    <calories>900</calories>
</food>
</breakfast_menu> ```

Below is the code i have tried so far.

file: read0 `$"File.xml"
file1: raze file
file2: enlist file2

无法进一步解析记录。任何建议都会有所帮助。

【问题讨论】:

  • 我会说 q 在我看来不是要走的路。

标签: kdb


【解决方案1】:

对于纯 q 解决方案,您可以尝试使用此 xml.q(此处翻译自 xml.k)。这不是一个完整的翻译(xml.k 可以解析和编码 XML,这里我只翻译了解析)并且可能不如使用 C/python 的其他解决方案高效或健壮,但它似乎允许解析您的示例 XML (另存为breakfast.xml):

q)b:.xml.dx raze read0`:breakfast.xml
q)b
`breakfast_menu
((`food;((`name;"Belgian Waffles");(`price;"$5.95");(`description;"Two of our..
q)b[0]
`breakfast_menu
q)b[1]
`food ((`name;"Belgian Waffles");(`price;"$5.95");(`description;"Two of our f..
`food ((`name;"Strawberry Belgian Waffles");(`price;"$7.95");(`description;"L..
q)      

请注意,由于 xml 文件中的行缩进等原因,解析后某些字符串中可能会有一些额外的填充。您可以使用trim 来删除它,例如

q)b:trim .xml.kx raze read0`:breakfast.xml

【讨论】:

    【解决方案2】:

    我之前使用embedPy 编写了一个小实用程序qxml 来将XML 数据提取到kdb+ 进程中。

    q)\l qxml.q
    q)menu:.qxml.read[`:menu.xml]
    q)menu[`breakfast_menu;`food]
    name                         price   description                             ..
    -----------------------------------------------------------------------------..
    "Belgian Waffles"            "$5.95" "Two of our famous Belgian Waffles with ..
    "Strawberry Belgian Waffles" "$7.95" "Light Belgian waffles covered with stra..
    

    其他选项可能是:

    • 这些基于 C 的项目 xmlqexpat 也可以在 Github 上找到(我还没有测试过)。

    • 如果您可以先转换文件,kdb+ 可以使用 .j.k 原生解析 JSON。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      • 1970-01-01
      • 2014-05-13
      • 2016-10-31
      相关资源
      最近更新 更多