2014-04-19 76 views
0

我正在使用Vb.net,我需要從以下XML中獲取訪問的最大值。從XML獲取列表節點的最大值

<Pages> 
<Page posted="2006-03-27" visits="148" title="Don't Sweep That Under the Rug!"/> 
<Page posted="2006-07-12" visits="191" title="Tire Swings for Grownups"/> 
<Page posted="2006-11-07" visits="214" title="Eliminate Hornets from Your Picnic"/> 
<Page posted="2006-06-14" visits="296" title="Why Ants Invade Your Kitchen"/> 
<Page posted="2006-01-15" visits="227" title="101 Ways to Climb a Tree"/> 
<Page posted="2006-07-28" visits="133" title="The Beauty of a Frost-Free Refrigerator"/> 
<Page posted="2006-03-31" visits="316" title="How to Achieve Restful Sleep"/> 
<Page posted="2006-09-21" visits="232" title="Buying Your First Car"/> 
</Pages> 

我試了下面的代碼,它工作正常。

Dim Node As XmlNode = XmlDocumnet.SelectSingleNode("/Pages/Page/@visits[not(. <= ../preceding-sibling::Page/@visits) and not(. <=../following-sibling::Page/@visits)]") 

    If Node IsNot Nothing AndAlso Node.Value <> "" Then 
     MaxVisit= Convert.ToInt32(Node.Value) + 1 
    End If 

但是,如果Visist屬性具有重複值,則找不到它。 即,如果發現重複訪問並且還存在空訪問,則不存在最大值。

對於如:

<Page posted="2006-07-12" visits="214" title="Tire Swings for Grownups"/> 
<Page posted="2006-11-07" visits="214" title="Eliminate Hornets from Your Picnic"/> 

或:

<Page posted="2006-07-12" visits="" title="Tire Swings for Grownups"/> 
<Page posted="2006-11-07" visits="214" title="Eliminate Hornets from Your Picnic"/> 
+0

你是什麼意思「找不到正確的」? – Markus

+0

如果發現重複訪問,則不存在最大值。 –

+0

-webkit-box-shadow:0 0 10px 0px#110B0B inset; –

回答

1

要在情況下返回第一次出現,而不是沒有結果的有最大visits多個節點,改變你的XPath使用<代替<=

/Pages/Page/@visits[ 
     not(. < ../preceding-sibling::Page/@visits) 
      and 
     not(. < ../following-sibling::Page/@visits) 
     ] 

UPDATE:

除了上面的XPath,也過濾掉空visits,你可以試試這個方法:

/Pages/Page/@visits[ 
     not(. < ../preceding-sibling::Page/@visits) 
      and 
     not(. < ../following-sibling::Page/@visits) 
      and 
     normalize-space(.) 
     ] 
+0

嗨,感謝您的幫助。我試過你的解決方案。它的工作,但如果我有**的空值訪問**像'visited =「」'那麼它只返回0 ... –

+0

您可以通過使用XPath'normalize-space()'函數過濾空值,例如:'... [...和正常化空間(。)]' – har07

+0

您能否在回答中反映這一點。我是新來的 –

1

您可以使用下面的LINQ to XML而不是使用XPath查詢的XmlDocument :

Dim el = XDocument.Parse(xmlInput) 
Dim maxVisits = el.Descendants("Page") _ 
        .Select(Function(x) New With { _ 
             .Title = x.Attribute("Title").Value, _ 
             .Visits = If(String.IsNullPrEmpty(x.Attribute.Value), 
                0, 
                Integer.Parse(x.Attribute("Visits").Value)) }) _ 
        .OrderByDescending(Function(x) x.Visits) _ 
        .FirstOrDefault() 
+0

嗨,感謝您的幫助。我試過你的解決方案。它的工作,但如果我有**訪問的空值**像'visited =「」'那麼它只是返回錯誤爲**輸入字符串是不正確的格式**。 –

+0

@VigneshKumar:我已經添加了一個針對該字符串的空或空的檢查。如果屬性爲空,它現在也應該可以工作。 – Markus