正在分析xml字符串以在中获取某些标记值

本文关键字:获取 xml 字符串 | 更新日期: 2023-09-27 18:20:28

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

正在分析xml字符串以在中获取某些标记值

如果我正确理解你的问题,你想从源XML中提取Guid,你指出它是一个字符串。

您可以使用以下命令从字符串创建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,f5db10c517-4CDA-8aa-4E3F50B5FF3C

但是,如果要循环遍历结果并将每个结果单独传递给存储过程,我会跳过String.Join,只循环遍历List:

foreach (string id in uploads)
{
    // Do your stored procedure call for each Guid.
}

在回复评论时添加

在注释中的情况下,如果您有一个要获取其值的List,您基本上也会这样做,但在将其传递到存储的proc:之前,您需要检查是否为null,并(可能)将Guid转换为字符串

foreach (Guid? g in uploads)
{
    if (g != null)
    {
        string newGuid = g.ToString();
        // do your data access stuff here
    }
}

您不能使用元素的本地名称,因为您已经声明了命名空间。因此,您应该使用名称空间来提供名称:

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

我认为这要么是你想要的,要么可能会为前进的方向提供一些线索:

string xml = "";  // XML data here
XDocument doc = XDocument.Parse(xml);
List<Guid> guids = doc.Descendants("TaskGUID")
                         .Select(g => new Guid(g.Value))
                         .ToList();
相关文章: