解析xml字符串以获取其中的某些标记值

时间:2013-07-01 09:26:34

标签: c# xml-parsing

我有一个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

3 个答案:

答案 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();