我有一个xml字符串并且在其中有不同的记录,我想在每个记录中提取id。以下是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 :(得分: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中定义了一个名称空间(实际上是两个),除非你在元素名称前加上正确的名称,否则你不会得到任何结果。
您可以将最后两个步骤合并为一行,但我不是百分百肯定。
上面的代码已经过您的示例测试,并为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
}
}
答案 1 :(得分: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()));
答案 2 :(得分:0)
我认为这要么是你所追求的,要么可能会对未来的方向有所了解:
string xml = ""; // XML data here
XDocument doc = XDocument.Parse(xml);
List<Guid> guids = doc.Descendants("TaskGUID")
.Select(g => new Guid(g.Value))
.ToList();