2013-07-01 49 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