2013-07-01 77 views
0

中的某些標記值我有一個xml字符串,並有不同的記錄,我想提取每個記錄中的id。這裏是XML的一個樣本:解析xml字符串以獲得

<UploadsInformation > 
    <Record> 
     <TaskGUID>48A583CA-A532-419A-9CDB-292764CEC541</TaskGUID> 
    </Record> 
    <Record> 
     <TaskGUID>ED6BA682-2BB2-4ADF-8355-9C605E16E088</TaskGUID> 
    </Record> 
    <Record> 
     <TaskGUID>D20D7042-FC5B-4CF7-9496-D2D9DB68CF52</TaskGUID> 
    </Record> 
    <Record> 
     <TaskGUID>F5DB10C5-D517-4CDA-8AAA-4E3F50B5FF3C</TaskGUID> 
    </Record> 
</UploadsInformation> 

這是我作爲一個字符串來提取我的需要,但如果它的正確與否,因爲當我調試串似乎是xml文件不知道的信息而不僅僅是指定的GUID。

string data = new XDocument(new XElement("Record", 
    uploads.Select(guid => new XElement("TaskGUID", guid.ToString())))) 
    .ToString(); 

上傳爲:List<Guid?> uploads

+0

你想有一個'名單'作爲最終結果? – Bazzz

+0

@Bazzz是的,因爲我將最有可能有一個taskGuids列表循環通過 – Masriyah

+0

您正在創建一個新的XML文檔與您當前的查詢,這就是爲什麼你看到XML。你想成爲你的查詢的最終結果是什麼?源XML中的「TaskGUID」中的值? – Tim

回答

2

,你想從源XML中提取Guids,你指出這是一個字符串。

您可以用下面的命令字符串創建一個XDocument:

XDocument doc = XDocument.Parse(xmlString); 

XNamespace ns = "http://schemas.acatar.com/2013/03/Malt.Models"; 

List<string> uploads = doc.Descendants(ns + "TaskGUID") 
         .Select(x => x.Value).ToList(); 

string uploadString = String.Join(",", uploads); 

我用XNamespace,因爲有一個命名空間(二,實際上)在XML定義的,除非您前綴一個正確元素名稱將不會得到任何結果。

您可能可以將最後兩個步驟組合成一行,但我不能100%確定。

上述代碼用你的實施例中測試,並且產生用於uploadString以下值:

48A583CA-A532-419A-9CDB-292764CEC541,ED6BA682-2BB2-4ADF-8355-9C605E16E088,D20D7042-FC5B-4CF7 -9496-D2D9DB68CF52,F5DB10C5-D517-4CDA-8AAA-4E3F50B5FF3C

但是,如果要循環遍歷結果並單獨將每個結果傳遞給存儲過程,那麼我會跳過String.Join並僅循環通過列表:

foreach (string id in uploads) 
{ 

    // Do your stored procedure call for each Guid. 
} 

添加回複評論

在評論中的情況,如果你有一個List,你想要得到的值,你會做基本相同的,但你需要檢查爲空和(可能)轉換的GUID爲字符串傳遞到存儲過程之前:

foreach (Guid? g in uploads) 
{ 

    if (g != null) 
    { 

     string newGuid = g.ToString(); 

     // do your data access stuff here 
    } 
} 
+0

偉大 - 我剛剛注意到在另一個地方,我正在通過'List uploads'作爲參數,並且guid列表如下所示:'List guidID = new List (); (「GuidID.Add(」GuidID(「48A583CA-A532-419A-9CDB-292764CEC541」));'我怎樣才能通過它們循環並提取每個單獨的每個GUID到循環中的存儲過程? – Masriyah

+0

同樣的方法 - 只需使用列表中的每個循環來獲取列表中的每個Guid。雖然在這種情況下,因爲List有Guid?,所以你需要檢查null,並且你還需要(很可能)將Guid轉換爲一個字符串('string g = new Guid(stringValue);'是一種方式)。 – Tim

+0

如果您可以添加通過guid循環並將列表分配給字符串的結構,那麼這將是可能的嗎? – Masriyah

0

我想,這是不是你所追求的或許會提供一些線索的方向走:如果我正確理解你的問題

string xml = ""; // XML data here 

XDocument doc = XDocument.Parse(xml); 

List<Guid> guids = doc.Descendants("TaskGUID") 
         .Select(g => new Guid(g.Value)) 
         .ToList(); 
+1

這不會沒有設置命名空間的工作。 – keyboardP

2

不能使用元素的本地名稱,因爲你已經命名空間中聲明。所以,你應該使用命名空間提供名稱:

XNamespace ns = "http://schemas.acatar.com/2013/03/Malt.Models"; 
var guids = from r in xdoc.Root.Elements(ns + "Record") 
      select Guid.Parse((string)r.Element(ns + "TaskGUID")); 

或查詢您的XML不指定元素的名稱:

var guids = xdoc.Root.Elements() 
       .Select(r => Guid.Parse((string)r.Elements().Single())); 
+0

xdoc代表什麼?的XDocument? – Masriyah

+0

@ loop852是的,'var xdoc = XDocument.Parse(xml)' –

+1

@lazyberezovsky - 你錯過了一個結束)在你的第二個查詢:)第三)將關閉在選擇。 – Tim