2010-07-22 47 views
1

我有一个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的购买方案为例):

  1. /根/购买/产品/产品[ID = 001] /问候
  2. /根/基/产品/产品[ID = 001] /问候
  3. /根/购买/问候
  4. /根/基地/问候语

在那一刻,我开始在列表的顶部,运行的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; 

虽然它的工作原理,它看起来很尴尬,有点粗糙。在可读性方面是否有更好的方法?

+0

你为什么不这样做,在一个循环? RunXPath(xpaths [“Level”+ i.ToString()],document); – 2010-07-22 14:33:02

回答

0

一种选择是创建的路径集合,并遍历它:一般

string[] paths = {"Level1", "Level2", "Level3", "Level4"}; 
foreach(string path in paths) 
{ 
    result = RunXPath(xpaths[path], document); 
    if (!String.IsNullOrEmpty(result)) 
     return result; 
} 
return ""; 

,如果你发现自己写重复的代码,你应该考虑使用一个循环或方法(或两者) 。
此外,尽量不要使用相同的变量来处理不同的事情。寻找有意义的名字 - 这将有助于可读性,并帮助检测错误。这在你的陈述中没有那么令人讨厌,但足够重要。试想一下:

result = RunXPath(xpaths["/document/my:things/rooms[0]/floor"], document); 
Print(result); 
result = RunXPath(xpaths["/document/my:things/roomate/phone/mobile"], document); 
Print(result); 

我最近不得不调试代码完全一样,而且它重构为:

string floor = RunXPath(xpaths["/document/my:things/rooms[0]/floor"], document); 
Print(floor); 
string friendMobilePhone = RunXPath(xpaths["/document/my:things/roomate/phone/mobile"], document); 
Print(friendMobilePhone);