更新
我希望有一个表达式(XPath或Regex Expression,类似),它可以将XML元素与特定的命名空间相匹配。例如,我想找到链接元素的值(例如,我需要下面显示的http://url within <b:link>http://url</b:link>)
。但是,命名空间前缀根据不同的xml文件而有所不同,如案例1-3所示。
考虑名称空间前缀的允许字符(例如,允许/有效的任何字符),是否有人可以提供解决方案(XPath,Regex Expression或类似的?
请注意,因为xml文件未知,所以命名空间和前缀在运行时才会被识别。这是否意味着我不能使用这个XDocument / XmlDocument,因为它需要在代码中知道命名空间。
更新
案例1
<A xmlns:b="link">
<b:link>http://url
</b:link>
</A>
案例2
<A xmlns="link">
<link>http://url
</link>
</A>
案例3
<A xmlns:a123="link">
<a123:link>http://url
</a123:link>
</A>
请注意,link元素中的url可以是任何http url,直到运行时才会知道。
更新
请标记我的问题。
答案 0 :(得分:5)
您需要知道要处理的命名空间,并使用XmlNamespaceManager注册它们。这是一个例子:
XmlDocument doc = new XmlDocument();
doc.LoadXml("<A xmlns:b='link'><b:Books /></A>");
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("b", "link");
XmlNodeList books = doc.SelectNodes("//b:Books", nsmgr);
如果你想使用XDocument这样做,我建议它简洁,这是如何:
XDocument xDoc = XDocument.Parse("<A xmlns:b='link'><b:Books /></A>");
XNamespace ns = "link";
var books = xDoc.Descendants(ns + "Books");
如果您未提前知道命名空间,see this post将显示如何仅使用本地名称查询XDocument。这是一个例子:
XDocument xDoc = XDocument.Parse("<A xmlns:b='link'><b:Books /></A>");
var books = xDoc.Descendants().Where(e => e.Name.LocalName.ToLower() == "books");
答案 1 :(得分:1)
使用XML解析器,而不是正则表达式。
话虽如此,你可以使用:
<(?:(.+?):)?Books />
命名空间将在捕获的组1中。
事实上,我强烈建议你使用
<(?:([^<>]+?):)?Books />
为了防止错误,比如匹配另一组XML标签(谁会在命名空间中使用<>
?)