我有以下模拟XML。具有多层ChildEntity元素的树和最后的Property值。
<Root>
<Family>
<Guardian name="James">
<EntityID>123</EntityID>
<ChildEntity>
<Name>Rita</Name>
<ChildEntity>
<Name>Anna</Name>
<ChildEntity>
<Name>Tina</Name>
<ChildEntity>
<Name>Sally</Name>
<Property>
<ValueID>666</ValueID>
</Property>
</ChildEntity>
</ChildEntity>
</ChildEntity>
</ChildEntity>
</Guardian>
<Guardian name="Jake">
<EntityID>234</EntityID>
<ChildEntity>
<Name>Anna</Name>
<ChildEntity>
<Name>Isabel</Name>
<ChildEntity>
<Name>Tina</Name>
<ChildEntity>
<Name>Rita</Name>
<Property>
<ValueID>777</ValueID>
</Property>
</ChildEntity>
</ChildEntity>
</ChildEntity>
</ChildEntity>
</Guardian>
<Guardian name="Richard">
<EntityID>456</EntityID>
<ChildEntity>
<Name>Michelle</Name>
<ChildEntity>
<Name>Sally</Name>
<ChildEntity>
<Name>Tina</Name>
<ChildEntity>
<Name>Anna</Name>
<Property>
<ValueID>888</ValueID>
</Property>
</ChildEntity>
</ChildEntity>
</ChildEntity>
</ChildEntity>
</Guardian>
</Family>
</Root>
基于为Child Entity提供的序列(即父子关系),我必须派生Property / ValueID text()。
例如,如果输入序列是(Anna,Tina) - Anna是父,Tina the Child - 我必须识别具有此序列的节点,然后导出属性值。在上面的例子中,它将是666预期值。
输入本质上是动态的,因此它可以是父,子父,子(即3个实体)。
在这种情况下,我想就什么是解决这个问题的最佳方法寻求建议?
我在思考的方式是迭代的, 第1步:我从Parent实体开始,获取具有此实体的所有节点 第2步:在步骤1中选择的节点中,检查我有子实体的位置
这是一种有效的方法吗?有没有其他更好的方法来处理这个? 考虑到输入的动态特性,单个Xpath查询能否给出我想要的结果?
您的意见非常赞赏。
答案 0 :(得分:0)
很难说你有一个变量输入。但是在一般情况下,您的XPath将看起来像这两种:
/ChildEntity[Name="$parent"]/ChildEntity[Name="$child"]/Property/ValueID/text()
/ChildEntity[Name="$parent"]/ChildEntity[Name="$sub-parent"]/ChildEntity[Name="$child"]/Property/ValueID/text()
不幸的是,XPath是一种查询语言,它无法进行自己的查询。但是看一下上面的一般模式,在伪代码中你想要做这样的事情:
List input; //e.g. ['Anna','Tina'] -> '666' or ['Anna','Isabel','Tina'] -> '777'
query = "";
for person in input {
query = query + "/ChildEntity[Name='{person}']"; //Assuming some string formatting
}
query = query + "/Property/ValueID/text()";
document.xpath(query);