Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用XML存储二维表(决策表)以实现高效查询_Java_Xml - Fatal编程技术网

Java 用XML存储二维表(决策表)以实现高效查询

Java 用XML存储二维表(决策表)以实现高效查询,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将其加载到内存中,

我需要实现一个路由表,其中有许多参数

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

Customer Txn Group Txn Type Sender Priority  Target
UTI       CORP     ONEOFF   ABC    LOW       TRG1
UTI       GOV      ONEOFF   ABC    LOW       TRG2
用XML表示这些数据以便高效查询的最佳方法是什么

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

感谢您的任何意见

谢谢,
Manglu

这取决于什么是重复的,什么可能是空的。XML的高效可查询性并不为人所知,因为它既不是固定长度的,也不是紧凑的。

如果要将其加载到内存中,XML采用什么形式其实并不重要,我建议让它成为最容易手动读写的。当您将其加载到内存中时,应该将其转换为适当的数据结构。(数据结构的确切性质取决于需求的确切性质。)

编辑:这是为了反驳Dimitre在评论中提出的论点:

我不确定你是否认为我是在建议人们实现他们自己的哈希表——我当然不是。只需为每个要用作键的列保留一个直接的哈希表,或者可能是一个。开发人员知道如何使用哈希表

至于运行时效率,您认为哪一种效率更高:

  • 您构建了一些XSLT(请记住,对于大多数开发人员来说,这是一个陌生的领域,至少相对而言是如此)
  • XSLT引擎解析它。如果您使用的XSLT库只允许对现有查询进行参数化,则可以避免此步骤。即便如此,你还有一些额外的工作要做
  • XSLT引擎点击哈希表(至少您希望如此)并返回一个节点
  • 将节点转换为更有用的数据结构
或:

  • 您可以根据给定的键在哈希表中查找适当的条目,直接获得有用的数据结构

我个人认为我会相信第二个。在这里使用XSLT就像用螺丝刀敲钉子一样…

我同意前面两张海报的观点-在查询消息时,绝对不应该将此数据的内部表示形式保留为XML

XML表示可以是任何形式,您可以这样做:

<routes>
  <route customer="UTI" txn-group="CORP" txn-type="ONEOFF" .../>
  ...
  </routes>

...
我的内部表现取决于收到的信息的格式和语言。一个简单的表示是地图,将数据结构(即,做出路由决策的关键字段)映射到目标路由上的信息


根据您的性能要求,您可以将键/目标信息保留为字符串,尽管在任何高性能系统中,您可能希望进行直接内存比较(在C/C++中)或某种形式的整数比较。

是的,您的基本问题是在同一句话中使用“XML”和“高效”


编辑:不,说真的,你杀了我。该线程中有几个人使用“高效”来描述与数据格式上的操作有关的任何内容,这些数据格式需要字符串解析来找出字段的位置,这一事实表明,该线程中有几个人甚至不知道“高效”一词的含义。你想说什么就说什么。我可以接受,coach。

这是一个纯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>

使用指令和XSLT函数查询这种格式的数据是一种非常有效的方法

<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>
<record Customer="UTI" 
        Txn-Group="Gov" Txn-Type="ONEOFF" 
        Sender="ABC2" Priority="LOW" 
        Target="TRG2"/>
此转换

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

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

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

注意以下事项:

<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>
<record Customer="UTI" 
        Txn-Group="Gov" Txn-Type="ONEOFF" 
        Sender="ABC2" Priority="LOW" 
        Target="TRG2"/>
  • 可以定义多个
    s,它们使用要连接在一起的不同值组合(任何被视为“键”和/或“主键”)来标识记录

  • 如果定义了使用“主键”串联的
    ,则在计算key()函数时将找到唯一的记录(或无记录)

  • 如果将
    定义为使用“非主键
    ”的串联,则在计算key()函数时可能会找到多个记录

  • 指令相当于在数据库中定义索引。这使得使用key()函数非常有效

  • 在许多情况下,不需要将上述XML格式转换为中间数据结构,这既不考虑可理解性,也不考虑效率


  • 将数据转换为另一个数据结构不是“必须”甚至“应该”。有时这种转换(往返)的时间比处理的时间要长。XML表示通常能很好地表达数据和关系,最好保持原样。@Jon Skeet它并不比将数据加载到哈希表慢,因为哈希表是xslt键的典型实现。这是一个更高的层次,XSLT处理器为您做这件事,您不能犯任何您自己在使用HT时通常会犯的错误。因为“对于绝大多数程序员来说,使用它要困难得多”,事实恰恰相反:您自己的哈希表不会出错,也不会花时间在设计上,对附加数据结构进行编码和调试。您可以更快地获得正确的解决方案,并有更多的时间对其进行优化。@Jon Skeet让我们将感觉与事实分开,即使形式不同