C# 搜索XML文件中所有元素级别的节点

C# 搜索XML文件中所有元素级别的节点,c#,.net,xml,xml-parsing,linq-to-xml,C#,.net,Xml,Xml Parsing,Linq To Xml,我有一些XML文件的格式版本,需要使用C#上传到DB。但是我现在不知道我需要导入的标签是什么级别的,因为根据xml的版本,标签可能是内部组或标签 XML文件的一些示例 Ex1) <a> <group1> <tag>searched tag</tag> </group1> <b> </b> <c> </c> </a> Ex

我有一些XML文件的格式版本,需要使用C#上传到DB。但是我现在不知道我需要导入的标签是什么级别的,因为根据xml的版本,标签可能是内部组或标签

XML文件的一些示例

Ex1)
<a>
   <group1>
      <tag>searched tag</tag>      
   </group1>
   <b>   </b>
   <c>   </c>
</a>

Ex2)
<a>
   <b>
      <group1>
          <c>
             <tag>searched tag</tag>
          </c>
      </group1>
   </b>
</a>
Ex1)
搜索标签
例2)
搜索标签
搜索的标记将始终位于group1标记内,并且所有文件都具有xmlns和schema属性

我尝试使用xml.SelectSingleNode(\group1\tag),但当文件具有架构头和命名空间配置时抛出错误


提前感谢。

如果您确定元素
标记
位于
group1
之下,并且它们之间可以有任意级别的中间节点,并且假设所有元素都在全局命名空间中,那么请使用:(注意斜线的方向):

但是,如果您不知道各个元素位于哪个
xmlns
中,则需要这样做:

xml.SelectSingleNode("//*[local-name()='group1']//*[local-name()='tag']")
但是请注意,在MSXml解析器中对大文件使用“//”可能有点慢,因此速度会更快,例如,如果您可以隔离到各个节点的确切路径,然后可以使用
|

e、 g.在您的示例中,如果标记可以是“或”
Ex1
Ex2
,则:

/a/group1/tag | /a/b/group1/c/tag

应该有用。

我试着像答案一样使用本地名称标记,但仍然得到一个空的XmlNode。我创建的唯一方法是使用xml.GetElementsByTagName(childNodeName)传递group1名称并在收到的XMLNodeList中搜索标记。我的错-我在
local-name()
-修复后错过了
()
-修复-我使用MsXml检查了几个测试文件。太棒了!这适用于选择标记值和选择所有group1元素…谢谢
/a/group1/tag | /a/b/group1/c/tag