2014-06-08 73 views
-1

我有一個字符串值,如下所示。如何返回引號中包含的所有值。 下面的答案是70116280,05/06/2014 16:31:38等......本質上,答案就是引用列表中的所有內容。使用Linq查找值

字符串值

<!-- Capacitor Stack Signoff Record --> 
<stack_signoff_result lead_traveler="70116280" date="05/06/2014 16:31:38" 
    employee_id="testuser" total_energy="77.266345" status="true" 
    operation_mode="Manual" result_detail="NA"> 
    <signoff_data> 
    <adhesive part_number="1234" kanban_number="5678"/> 
    </signoff_data> 
    <capacitor_set> 
    <top_capacitor traveler="45911012" energy="26.000567" capacitance="0.000287553595"/> 
    <middle_capacitor traveler="45817588" energy="25.576334" capacitance="0.00028426705"/> 
    <bottom_capacitor traveler="45911141" energy="25.689444" capacitance="0.000284239714"/> 
    </capacitor_set> 
</stack_signoff_result> 
+0

Q :這是一個很好的例子嗎?我沒有看到任何值:我期望像'-date 6/8/2014'這樣的東西,而不僅僅是「-date」。無論如何,請看這裏:http://msdn.microsoft.com/en-us/library/bb397915.aspx。發佈任何具體問題(以及您嘗試的代碼)。 – FoggyDay

+0

@FoggyDay再次檢查問題。它很難寫在平板電腦上的問題.... – user1438082

+2

使用[System.Xml.Linq](http://msdn.microsoft.com/en-us/library/system.xml.linq.aspx)。 –

回答

2

我認爲最簡單的方法是使用XPath queires:

using System.Linq; 
using System.Xml.Linq; 
using System.Xml.XPath; 

... 

XDocument document = XDocument.Parse(stringValue); 

var xpath = @"//stack_signoff_result[@lead_traveler='70116280']"; 
var result = from item in document.XPathSelectElements(xpath) 
    select item; 

foreach (var item in result) 
{ 
    ... 
} 

UPDATE:要獲得所有引用屬性值可以使用LINQ oneliner下方(爲了便於閱讀,我對它進行了格式化,但是可以將代碼壓扁到單行)。

var result = string.Join(
    ",", 
    XElement 
     // Parse xml or can reuse element found in code above 
     .Parse(string value) 
     // Search in element and all its descendants 
     .DescendantsAndSelf() 
     // Select all atributtes (quoted values) 
     .SelectMany(item => item.Attributes()) 
     // Select attribute value 
     .Select(item => item.Value) 
); 

該解決方案不像字符串操作那麼快,但更穩定。例如,如果在Enigmativity的代碼中將文本節點中的引號括起來,則會得到錯誤的結果。

而且它更容易與你寫在第一個版本的搜索任務混合:

var result = XDocument 
    .Parse(stringValue) 
    .XPathSelectElements(@"//stack_signoff_result[@lead_traveler='70116280']") 
    .Select(item => 
     string.Join(
      ",", 
      item.DescendantsAndSelf() 
      .SelectMany(element => element.Attributes()) 
      .Select(element => element.Value) 
     ) 
    ) 
; 
+0

必須是單引號,它將引號中包含的所有值返回給列表。 – user1438082

+0

上面的代碼已更新。您可以將它與以前的代碼混合到一個班輪中,這將同時找到所需的XML元素(如問題的第一個版本)並獲取所有格式化的屬性。 – Stan

1

試試這個:

var result = String.Join("", text.Split('"').Where((x, n) => n % 2 == 1)); 

我得到這個:

7011628005/06/2014 16:31:38testuser77.266345trueManualNA123456784591101226.0005670.0002875535954581758825.5763340.000284267054591114125.6894440.000284239714