在C#中如何根据节点属性获取XML的file路径值?
解决方法
1. 处理命名空间问题
你的XML包含默认命名空间(xmlns="xxx"),所有元素都属于这个命名空间,直接写XPath会找不到节点。必须先注册命名空间前缀:
XmlNamespaceManager nsManager = new XmlNamespaceManager(xmldoc.NameTable); nsManager.AddNamespace("ns", "xxx"); // 替换成XML中实际的命名空间URI
2. 针对性XPath查询
(1)批量获取所有含"red"的路径
XmlNodeList redNodes = xmldoc.SelectNodes( "/ns:OrderExchangeMessage[@version='9.0']/ns:Command/ns:AddOrderRequest/ns:Order/ns:InnerOrder/ns:RestorationOrder[@version='5.0']/ns:ModelElements/ns:ModelElement[contains(@displayName, 'red')]/ns:files/ns:file", nsManager ); // 遍历输出路径 foreach (XmlNode node in redNodes) { string path = node.Attributes["path"]?.Value; Console.WriteLine(path); }
(2)区分"red car"和"red truck"单独获取
- 获取"red car"对应的路径:
XmlNode redCarNode = xmldoc.SelectSingleNode( "/ns:OrderExchangeMessage[@version='9.0']/ns:Command/ns:AddOrderRequest/ns:Order/ns:InnerOrder/ns:RestorationOrder[@version='5.0']/ns:ModelElements/ns:ModelElement[@displayName='red car']/ns:files/ns:file", nsManager ); string redCarPath = redCarNode?.Attributes["path"]?.Value;
- 获取"red truck"对应的路径:
XmlNode redTruckNode = xmldoc.SelectSingleNode( "/ns:OrderExchangeMessage[@version='9.0']/ns:Command/ns:AddOrderRequest/ns:Order/ns:InnerOrder/ns:RestorationOrder[@version='5.0']/ns:ModelElements/ns:ModelElement[@displayName='red truck']/ns:files/ns:file", nsManager ); string redTruckPath = redTruckNode?.Attributes["path"]?.Value;
核心要点
- 所有XPath中的元素必须加上注册的命名空间前缀(示例中用
ns:,可自定义) contains(@displayName, 'red')用于模糊匹配属性中包含指定文本的节点- 精确匹配
@displayName='red car'可直接定位特定类型的节点,实现区分需求
内容的提问来源于stack exchange,提问作者LockedInside
相关产品推荐
相关产品推荐

