代码之家  ›  专栏  ›  技术社区  ›  yogsma

java中XML的比较

  •  3
  • yogsma  · 技术社区  · 14 年前

    这里是两个xml,我试图比较并将各自的数据放入excel表中。

    我有一个多维数组叫做provisions。

    <xml>
    <Item type="ItemHeader" name="Plan Features" id="id_1"></Item>
    <Item type="Deductible" name="Deductible" id="a">Calendar Year
     <Item type="Text" name="Individual" id="b">5,000</Item>
     <Item type="Text" name="Family" id="c">10,000</Item>
     <Item type="Text" name="Family Out-of-Network" id="id_4">15,000</Item>
    </Item>
    <Item lock="|delete|" type="Empty" name="Out-of-Pocket Annual Maximum" id="id_2">
     <Item type="Text" name="Individual" id="d">5,000</Item>
     <Item type="Text" name="Family" id="e">10,000</Item>
    </Item>
    <Item type="Text" name="Life Time Maximum" id="u">Unlimited</Item>
    <Item type="Text" name="Coinsurance" id="f"></Item>
    <Item type="Text" name="Office Visits" id="g"></Item>
    <Item type="Text" name="Routine Physicals" id="h"></Item>
    <Item type="Text" name="Preventive Care" id="m"></Item>
    <Item type="Text" name="Physician Services" id="i"></Item>
    <Item type="Text" name="Emergency Room Services / Urgent Care" id="j"></Item>
    <Item type="Text" name="Hospital Admission Services" id="k"></Item>
    <Item type="Text" name="Chiropractic" id="n"></Item>
    <Item type="Text" name="Prescription Drugs" id="l"></Item>
    <Item type="Text" name="Specialty Drugs" id="o"></Item>
    <Item type="Boolean" name="Pre Tax Reduction Available" id="t">false</Item>
    <Item type="Boolean" name="Conversion Privilege" id="p">false</Item>
    <Item type="ItemHeader" name="Plan Setup" id="id_3"></Item>
    <Item type="Termination" name="Benefit Termination Date" id="q">Immediate</Item>
    <Item type="Determination" name="Premium Redetermination Date" id="r">Not Applicable</Item>
    <Item type="Participation" name="Participation Requirement" id="s"></Item>
    </xml>
    

    <xml>
    <Item type="ItemHeader" name="Plan Features" id="id_1"></Item>
    <Item type="Deductible" name="Deductible" id="a">Calendar Year
     <Item type="Text" name="Individual" id="b">3,000</Item>
     <Item type="Text" name="Family" id="c">6,000</Item>
    </Item>
    <Item lock="|delete|" type="Empty" name="Out-of-Pocket Annual Maximum" id="id_2">
     <Item type="Text" name="Individual" id="d">5,000</Item>
     <Item type="Text" name="Family" id="e">10,000</Item>
    </Item>
    <Item type="Text" name="Life Time Maximum" id="u">Unlimited</Item>
    <Item type="Text" name="Coinsurance" id="f"></Item>
    <Item type="Text" name="Office Visits" id="g"></Item>
    <Item type="Text" name="Routine Physicals" id="h"></Item>
    <Item type="Text" name="Preventive Care" id="m"></Item>
    <Item type="Text" name="Physician Services" id="i"></Item>
    <Item type="Text" name="Emergency Room Services / Urgent Care" id="j"></Item>
    <Item type="Text" name="Hospital Admission Services" id="k"></Item>
    <Item type="Text" name="Chiropractic" id="n"></Item>
    <Item type="Text" name="Prescription Drugs" id="l"></Item>
    <Item type="Text" name="Specialty Drugs" id="o"></Item>
    <Item type="Boolean" name="Pre Tax Reduction Available" id="t">false</Item>
    <Item type="Boolean" name="Conversion Privilege" id="p">false</Item>
    <Item type="ItemHeader" name="Plan Setup" id="id_3"></Item>
    <Item type="Termination" name="Benefit Termination Date" id="q">Immediate</Item>
    <Item type="Determination" name="Premium Redetermination Date" id="r">Not Applicable</Item>
    <Item type="Participation" name="Participation Requirement" id="s"></Item>
    </xml>
    

    现在,这个XML数据用于2个计划,我的provisions数组包含

    规定==[[计划特征,,][免赔额,,][个人,,]…]

    for(int j = 0; j < plans.length; j++){
        Vector<String> vr = (Vector<String>) tagidPlan.get(plans[j].getId());
        for(int i = 0; i < vr.size(); i++){
         provisions[i][j+1] = getValues(plans[j],vr.get(i));
        }
    }
    

    这个问题发生在网络之外的家庭的额外节点出现时。这是我最后的阵型

    [[Plan Features:, Medical HMO, Medical PPO], [Deductible Year:, Calendar Year, Calendar Year], [Individual:, 5,000, 3,000], [Family:, 10,000, 6,000], [Family Out-of-Network:, 15,000, null], [Out-of-Pocket Annual Maximum:, null, 5,000], [Individual:, 5,000, 10,000], [Family:, 10,000, Unlimited], [Life Time Maximum:, Unlimited, ], [Coinsurance:, , ], [Office Visits:, , ], [Routine Physicals:, , ], [Preventive Care:, , ], [Physician Services:, , ], [Emergency Room Services / Urgent Care:, , ], [Hospital Admission Services:, , ], [Chiropractic:, , ], [Prescription Drugs:, , ], [Specialty Drugs:, , false], [Pre Tax Reduction Available:, false, false], [Conversion Privilege:, false, ], [Plan Setup:, , Immediate], [Benefit Termination Date:, Immediate, Not Applicable], [Premium Redetermination Date:, Not Applicable, ], [Participation Requirement:, , null]]
    

    我想在相应的数组元素中得到正确的值。

    这里可以看到更多的代码 pastie.org/1308625

    5 回复  |  直到 14 年前
        1
  •  4
  •   barrowc    14 年前

    不要使用数组。

    使用: Map<String, Map<String, String>>

    • 第一个字符串(外部映射的键)是特征名(例如“生命期最大值”)。
    • 第二个字符串(内部映射的键)是计划名称(XML文档中似乎没有任何实际的计划名称,因此“Plan1”和“Plan2”就足够了)
    • 第三个字符串(内图的值)应该是那个特定计划中的特定特征的值(例如“Prim1”中的“寿命最大”)的“无限”。

    { Life Time Maximum: { Plan1: Unlimited, Plan2: Unlimited } }
    { Family Out-Of-Network: { Plan1: 15,000 } }
    

    因为,与数组不同,每个特性的条目数不必固定(不同的特性可以有不同的条目数)

        3
  •  2
  •   Jeff Knecht    14 年前

    DiffX (用于XML Diffing的开源Java API)。它提供了比较XML文档的算法,并为您提供了添加/删除/更改的节点/属性/文本的良好摘要(更改表示为删除,然后是插入)。我们正在一个我目前参与的项目中使用它;它工作得非常好。

        4
  •  1
  •   Aaron Digulla    14 年前

    下面是一个简单的算法:

    • 将数据加载到两个DOM模型中
    • 尝试在第二个模型中找到相同的节点。如果找不到一个-你发现一个只存在于文档1中的节点
    • 删除第二个文档中的节点,除非它有子节点
    • 尝试在第一个模型中找到相同的节点。如果找不到一个-你发现一个只存在于文档2中的节点

        5
  •  0
  •   Aravind Yarram    14 年前

    我想你是在发明轮子。研究以下开源替代方案: http://blogs.msdn.com/b/dmahugh/archive/2008/06/18/open-xml-diff-tools.aspx