我很难准确地描述问题的标题,也许通过示例更容易理解。
假设我有一个来自系统A的XML文档,它看起来像这样:
<root>
<phone_numbers>
<phone_number type="work">123-WORK</phone_number>
<phone_number type="home">456-HOME</phone_number>
<phone_number type="work">789-WORK</phone_number>
<phone_number type="other">012-OTHER</phone_number>
</phone_numbers>
<email_addresses>
<email_address type="home">a@home</email_address>
<email_address type="other">b@other</email_address>
<email_address type="home">c@home</email_address>
<email_address type="work">d@work</email_address>
<email_address type="other">e@other</email_address>
<email_address type="other">f@other</email_address>
</email_addresses>
</root>
我需要将这些内容放入以下结构中,以便在系统B中使用:
<root>
<addresses>
<address name="work1">
<phone_number>123-WORK</phone_number>
<email_address>d@work</email_address>
</address>
<address name="work2">
<phone_number>789-WORK</phone_number>
</address>
<address name="other1">
<phone_number>012-OTHER</phone_number>
<email_address>b@other</email_address>
</address>
<address name="other2">
<email_address>e@other</email_address>
</address>
<address name="other3">
<email_address>f@other</email_address>
</address>
<address name="home1">
<phone_number>456-HOME</phone_number>
<email_address>a@home</email_address>
</address>
<address name="home2">
<email_address>c@home</email_address>
</address>
</addresses>
</root>
每种类型可以有任意数量的电子邮件地址(据我所知,从0到无穷大)。每种类型也可以有任意数量的电话号码,而一种类型的电话号码数量不必与同一类型的电子邮件地址数量匹配。
除了它们按照添加到系统A中的顺序输入之外,第一个文档中的电子邮件地址和电话号码实际上并没有关联。
我必须按类型将电子邮件地址和电话号码配对以适应系统B,并且我想将它们配对,以便类型X的第一个电话号码与类型X的第一个电子邮件地址配对,并且不会将类型X的任何电话号码与类型不同的电子邮件配对。
由于我必须将它们配对,而且由于它们被输入到系统的顺序是我找到双方关系的最接近方式,因此我希望以这种方式对它们进行排序。我将不得不告诉用户检查结果是否合理,但我必须将它们配对 - 没有选择。
复杂化问题的是,我的实际XML文档具有更多的节点,我需要将其与phone_numbers和email_addresses合并,并且我有超过两个@types。
另一个注意事项:我已经计算了任何给定类型的最大节点数,因此对于我的示例文档,我知道单个@type的最大节点数为三(具有@type = other的三个节点=具有@name = otherX的三个节点)。