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