解析xml字符串以获得
中的某些标记值我有一个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
,你想从源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
}
}
伟大 - 我刚刚注意到在另一个地方,我正在通过'List
同样的方法 - 只需使用列表中的每个循环来获取列表中的每个Guid。虽然在这种情况下,因为List有Guid?,所以你需要检查null,并且你还需要(很可能)将Guid转换为一个字符串('string g = new Guid(stringValue);'是一种方式)。 – Tim
如果您可以添加通过guid循环并将列表分配给字符串的结构,那么这将是可能的吗? – Masriyah
我想,这是不是你所追求的或许会提供一些线索的方向走:如果我正确理解你的问题
string xml = ""; // XML data here
XDocument doc = XDocument.Parse(xml);
List<Guid> guids = doc.Descendants("TaskGUID")
.Select(g => new Guid(g.Value))
.ToList();
这不会没有设置命名空间的工作。 – keyboardP
不能使用元素的本地名称,因为你已经命名空间中声明。所以,你应该使用命名空间提供名称:
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()));
你想有一个'名单'作为最终结果? –
Bazzz
@Bazzz是的,因为我将最有可能有一个taskGuids列表循环通过 – Masriyah
您正在创建一个新的XML文档与您当前的查询,这就是为什么你看到XML。你想成为你的查询的最终结果是什么?源XML中的“TaskGUID”中的值? – Tim