我有一个XML结构如下所示:易读的方式返回第一个XPath的结果
<Root>
<Base>
<Greeting>Base Hello!</Greeting>
<SpecialMessage>Base Special Message</SpecialMessage>
<Products>
<Product id="001">
<Greeting>Base 001 Hello!</Greeting>
</Product>
</Products>
</Base>
<Buy>
<Greeting>Buy Hello!</Greeting>
<SpecialMessage>Buy Special Message</SpecialMessage>
<Products>
<Product id="001">
<Greeting>Buy 001 Hello!</Greeting>
</Product>
</Products>
</Buy>
<Rent>
<Greeting>Rent Hello</Greeting>
</Rent>
</Root>
基地,购买和出租的节点会一直存在,但在其中可能或不可能的节点。在运行时,我将确定这是否为购买或租用方案。我也可能有或没有产品ID。
例如,如果这是一个购买场景,产品ID是“001”,我会得到“Buy 001 Hello”消息。但是,如果“购买”部分中的“产品”部分因任何原因而缺失,我会返回“Base 001 Hello”。
第二个例子是如果我想要租用方案的SpecialMessage。由于没有SpecialMessage节点是在租金部分,我将回到“基特别消息”
我组装这样的XPath的列表,使用问候语作为产品001的购买方案为例):
- /根/购买/产品/产品[ID = 001] /问候
- /根/基/产品/产品[ID = 001] /问候
- /根/购买/问候
- /根/基地/问候语
在那一刻,我开始在列表的顶部,运行的XPath,返回的结果,如果它发现下一个XPath和等,其他明智之举:
string result;
result = RunXPath(xpaths["Level1"], document);
if (!String.IsNullOrEmpty(result))
return result;
result = RunXPath(xpaths["Level2"], document);
if (!String.IsNullOrEmpty(result))
return result;
result = RunXPath(xpaths["Level3"], document);
if (!String.IsNullOrEmpty(result))
return result;
result = RunXPath(xpaths["Level4"], document);
if (!String.IsNullOrEmpty(result))
return result;
return String.Empty;
虽然它的工作原理,它看起来很尴尬,有点粗糙。在可读性方面是否有更好的方法?
你为什么不这样做,在一个循环? RunXPath(xpaths [“Level”+ i.ToString()],document); – 2010-07-22 14:33:02