java - 在 XML 中存储二维表(决策表)以实现高效查询

标签 java xml

我需要实现一个包含许多参数的路由表。

例如,我在下面的传入消息中声明了五个属性

Customer Txn Group Txn Type Sender Priority  Target
UTI       CORP     ONEOFF   ABC    LOW       TRG1
UTI       GOV      ONEOFF   ABC    LOW       TRG2

用 XML 表示此数据以便高效查询的最佳方式是什么?

我想将这些数据存储在 XML 中,并使用 Java 将其加载到内存中,当消息传入时,我想根据属性来识别目标。

感谢任何意见。

谢谢, 芒格鲁

最佳答案

这是一个纯 XML 表示形式,可以按原样进行非常高效的处理,无需转换为任何其他内部数据结构:

<table>
 <record Customer="UTI" Txn-Group="CORP" 
      Txn-Type="ONEOFF" Sender="ABC1" 
      Priority="LOW"  Target="TRG1"/>

 <record Customer="UTI" Txn-Group="Gov" 
      Txn-Type="ONEOFF" Sender="ABC2" 
      Priority="LOW"  Target="TRG2"/>


</table>

有一种非常有效的方法可以使用 <xsl:key> 查询这种格式的数据。指令和 XSLT key()功能:

这种转变:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>

 <xsl:key name="kRec" match="record"
  use="concat(@Customer,'+',@Sender)"/>

    <xsl:template match="/">
      <xsl:copy-of select="key('kRec', 'UTI+ABC2')"/>
    </xsl:template>
</xsl:stylesheet>

应用于上述 XML 文档时会产生所需的结果:

<record Customer="UTI" 
        Txn-Group="Gov" Txn-Type="ONEOFF" 
        Sender="ABC2" Priority="LOW" 
        Target="TRG2"/>

请注意以下事项:

  1. 可以有多个 <xsl:key>定义,使用不同的值组合来连接在一起(无论什么被视为“键”和/或“主键”)来标识记录。

  2. 如果 <xsl:key>被定义为使用“主键”的串联,那么在评估 key() 函数时将找到唯一记录(或没有记录)。

  3. 如果 <xsl:key>被定义为使用“非主键”的串联,那么在计算 key() 函数时可能会找到多个记录。

  4. <xsl:key>指令相当于在数据库中定义索引。这使得使用 key() 函数极其高效

  5. 在许多情况下,没有必要将上述 XML 形式转换为中间数据结构,这既不是出于可理解性的原因,也不是出于效率的原因。

关于java - 在 XML 中存储二维表(决策表)以实现高效查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/534807/

相关文章:

java - 如何为通话功能创建确认对话框

java - 遇到 java.net.BindException : Address already in use (Bind failed) on server- client socket app

java - 如何以编程方式登录到 URL、保持 session 并浏览到不同的页面

java - 如何将 map 集合写入文件并读取它?

java - 如何在 Netbeans IDE 中组织文件夹内的文件

java - 强制不同的 Spring Repositories 使用相同的事务

Android:JSON 或 XML,缓存

xml - iPhone访问本地XML文件

android - 如何更改 xml 中的 EditText 光标和底线颜色?

c# - 如何将此 XPath 查询转换为 LINQ to XML?