获取具有node.InnerText的所有节点的GUID类型

时间:2018-01-25 04:29:31

标签: c# xml xml-parsing

<Step ID="6">
    <ACTION>Object Information</ACTION>
    <CLASS_ID>ControlType.Button</CLASS_ID>
    <UUID>5170c4b8-a949-49ed-bcf5-b0f689b8ec0d</UUID>   
    <ACTION_INFO>0bbde809-83c6-4f69-8b73-d20e193ddb89</ACTION_INFO>
    <REPOSITOR>OK</REPOSITOR>    
  </Step>
  <Step ID="7">
    <ACTION>Object Information</ACTION>
    <CLASS_ID>ControlType.Button</CLASS_ID>
    <UUID>5170c4b8-a949-49ed-bcf5-b0f689b8ec0d</UUID>   
    <REPOSITOR>0bbde809-83c6-4f69-8b73-d20e193ddb89</REPOSITOR>
    <TUID>Handle ,5000(ms),b034879a-ab31-4570-b2f6-bfd650d0ee67,5</TUID>
    <SUBACTION>OK</SUBACTION>        
  </Step>

我必须遍历xmldoc并获取所有节点,其中node.InnerText的类型为GUID,或者如果GUID位于字符串之间,那么

   XMLNodeList l_NodeToAppend = xDoc.SelectNodes("//text()"+"of type guid or guid in between string");

1 个答案:

答案 0 :(得分:2)

使用XPath无法做到这一点,因此我们将合并一些LINQ和Guid.TryParse

var guids = xDoc.SelectNodes("//Step/*")
        .Cast<XmlNode>()
        .Where(e => 
        {
            Guid temp;
            return Guid.TryParse(e.InnerText, out temp);
        })
        .ToList();

guids变量将包含InnerText可解析的所有元素。

如果您需要在内部文本中间找到guid,即与其他非guid字符串混合,那么您最好的选择是使用正则表达式*:

var pattern = "[a-fA-F0-9]{8}-([a-fA-F0-9]{4}-){3}[a-fA-F0-9]{12}";
var r = new Regex(pattern);

var guids = from e in xDoc.SelectNodes("//Step/*").Cast<XmlNode>()
        let m = r.Match(e.InnerText)
        where m.Success
        select m.Value;

<强> dotnetfiddle demo

*)这里有很多关于这个主题的问题。例如,此答案中的正则表达式来自How can I find all the Guids in some text?