C#在XML中查找具有给定属性名称的节点

时间:2018-10-22 09:23:50

标签: c# xml

我有一个很大的XML文档。如下所示:

<AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=]]>

<StreamsetInfoRecord>
  <StreamsetName>
    http://localhost/abc/abc08.osdinfra.net-88/abc/abc.partner/shares/abcAdmin/jobRepository/cooked/jobFileExts/2018/10/09/JobMetaData_20181009.ss
  </StreamsetName>
  <StreamsetInfoList>
    <StreamsetInfo 
        StreamId="859e1a91-bb17-46f6-94f4-79d67c1f7e83" 
        abcName="abc://abc08-dorp-co3c/vol61/system/jobRepository/cooked/jobFileExts/2018/10/09/JobMetaData_20181009.ss" 
        VcName="http://localhost/abc/abc08.osdinfra.net-88/abc/abc.partner/shares/abcAdmin/jobRepository/cooked/jobFileExts/2018/10/09/JobMetaData_20181009.ss" 
        Length="16132378830" 
        Count="3002" 
        CreationTime="10/10/2018 3:53:36 AM" 
        ExpirationTime="4/8/2019 3:53:36 AM" 
        ModificationTime="10/10/2018 3:12:02 AM" />
  </StreamsetInfoList>
</StreamsetInfoRecord>

现在从该文档中,我只想检索其中包含单词Length =的标签。即从上面的示例代码段中,我想检索以下信息:

StreamsetInfo 
  StreamId="859e1a91-bb17-46f6-94f4-79d67c1f7e83" 
  abcName="abc://abc08-dorp-co3c/vol61/system/jobRepository/cooked/jobFileExts/2018/10/09/JobMetaData_20181009.ss" 
  VcName="http://localhost/abc/abc08.osdinfra.net-88/abc/abc.partner/shares/abcAdmin/jobRepository/cooked/jobFileExts/2018/10/09/JobMetaData_20181009.ss" 
  Length="16132378830" 
  Count="3002" 
  CreationTime="10/10/2018 3:53:36 AM" 
  ExpirationTime="4/8/2019 3:53:36 AM" 
  ModificationTime="10/10/2018 3:12:02 AM" 

可以从XML中仅检索此信息。我知道我可以使用以下方法从属性中提取XML节点:

XmlNodeList xnList = xml.SelectNodes("...")

但是在上面的SelectNode中,我需要指定确切的XPath表达式。但是,在我的文档中,我只知道我感兴趣的标记包含名称为“ Length”的属性,但我不知道其确切的XML路径。

是否可以在C#中使用XML进行这种正则表达式搜索

2 个答案:

答案 0 :(得分:1)

尝试一下:

XmlNodeList xnList = xml.SelectNodes("//StreamsetInfo[@Length]")

答案 1 :(得分:0)

您可以使用xml linq轻松完成此操作:

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            List<XElement> lengthElements = doc.Descendants("StreamsetInfo").Where(x => x.Attribute("Length") != null).ToList();

            var results = lengthElements.Select(x => new {
                streamId = (string)x.Attribute("StreamId"),
                abcName = (string)x.Attribute("abcName"),
                vcName = (string)x.Attribute("VcName"),
                length = (long)x.Attribute("Length"),
                count = (int)x.Attribute("Count"),
                creationTime = (DateTime)x.Attribute("CreationTime"),
                expirationTime = (DateTime)x.Attribute("ExpirationTime"),
                modificationTime = (DateTime)x.Attribute("ModificationTime")
            }).ToList();

        }
    }
}