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