Xpath方法用于多层xml

时间:2013-11-27 00:59:59

标签: xml xpath

我有以下模拟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查询能否给出我想要的结果?

您的意见非常赞赏。

1 个答案:

答案 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);