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

时间:2013-08-01 13:25:50

标签: c# .net xml xml-parsing linq-to-xml

我有一些XML文件的格式版本需要使用C#上传到数据库。但我现在还不确定我需要导入的标签的级别,因为,根据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>

搜索到的标记将始终位于group1标记内,并且所有文件都具有xmlns和模式属性。

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

提前致谢。

1 个答案:

答案 0 :(得分:2)

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

xml.SelectSingleNode("//group1//tag")

但是,如果你知道哪个xmlns各自的元素,那么你需要这样做:

xml.SelectSingleNode("//*[local-name()='group1']//*[local-name()='tag']")

但请注意,在MSXml解析器中对大文件使用'//'可能会有点慢,所以它会更快,例如如果您可以隔离到各个节点的确切路径,然后可以使用|

e.g。在您的示例中,如果标记可以是“Ex1Ex2,那么:

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

应该有用。