使用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标签(谁会在命名空间中使用<> ?)