使用C#查找含特定FT_NAME值的XML FEATURE节点并获取FVALUE
问题:筛选BMECAT XML中指定FEATURE的FVALUE值
需求:从BMECAT格式的XML中,筛选所有FT_NAME值为"Breite"的FEATURE元素,并获取对应FVALUE的值。
尝试的C#代码无结果:
XElement root = XElement.Load("File.xml"); IEnumerable<XElement> elements = from el in root.Elements("FEATURE") where (string)el.Element("FT_NAME") == "Breite" select el;
对应的XML结构:
<?xml version="1.0" encoding="UTF-8"?> <BMECAT version="2005" xmlns="http://www.bmecat.org/bmecat/2005+onto" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eclass.eu/static/eClassXML/2.0/bmecat/bmecat_2005onto.xsd"> <T_NEW_CATALOG> <PRODUCT mode="new"> <PRODUCT_FEATURES> <FEATURE> <FTEMPLATE> <FT_ID>0173-1#02-BAC137#006</FT_ID> <FT_NAME>Breite</FT_NAME> </FTEMPLATE> <FVALUE>10</FVALUE> <FUNIT>0173-1#05-AAA480#003</FUNIT> <FID>375397708</FID> <FPARENT_ID>-1</FPARENT_ID> </FEATURE> <FEATURE> <FTEMPLATE> <FT_ID>0173-1#02-BAC476#007</FT_ID> <FT_NAME>Höhe</FT_NAME> </FTEMPLATE> <FVALUE>51.5</FVALUE> <FUNIT>0173-1#05-AAA480#003</FUNIT> <FID>375397709</FID> <FPARENT_ID>-1</FPARENT_ID> </FEATURE> <FEATURE> <FTEMPLATE> <FT_ID>0173-1#02-BAA351#014</FT_ID> <FT_NAME>Farbe</FT_NAME> </FTEMPLATE> <VALUE_IDREF>0173-1#07-AAA875#004</VALUE_IDREF> <FID>375397710</FID> <FPARENT_ID>-1</FPARENT_ID> </FEATURE> <FEATURE> <FTEMPLATE> <FT_ID>0173-1#02-BAA018#007</FT_ID> <FT_NAME>Länge</FT_NAME> </FTEMPLATE> <FVALUE>55.5</FVALUE> <FUNIT>0173-1#05-AAA480#003</FUNIT> <FID>375397711</FID> <FPARENT_ID>-1</FPARENT_ID> </FEATURE> </PRODUCT_FEATURES> </PRODUCT> </T_NEW_CATALOG> </BMECAT>
问题原因
- XML命名空间未处理:BMECAT根节点声明了命名空间
xmlns="http://www.bmecat.org/bmecat/2005+onto",所有子元素都属于该命名空间,直接使用元素名称无法匹配。 - 元素路径错误:
FT_NAME是FTEMPLATE的子元素,原代码直接从FEATURE下查找FT_NAME会返回null。
修正后的代码
// 加载XML文件 XElement root = XElement.Load("File.xml"); // 定义XML命名空间 XNamespace ns = "http://www.bmecat.org/bmecat/2005+onto"; // 筛选符合条件的FEATURE元素,并提取FVALUE IEnumerable<string> breiteValues = from feature in root.Descendants(ns + "FEATURE") let ftNameElement = feature.Element(ns + "FTEMPLATE")?.Element(ns + "FT_NAME") where ftNameElement != null && ftNameElement.Value == "Breite" select feature.Element(ns + "FVALUE")?.Value; // 遍历输出结果 foreach (string value in breiteValues) { Console.WriteLine("Breite的值:" + value); }
代码说明
- 用
XNamespace指定XML的命名空间,所有元素访问都需要加上命名空间前缀(ns + "元素名")。 - 使用
Descendants(ns + "FEATURE")遍历所有层级的FEATURE元素,避免因层级问题遗漏目标元素。 - 通过
feature.Element(ns + "FTEMPLATE")?.Element(ns + "FT_NAME")正确定位FT_NAME元素,同时处理可能的null情况避免报错。 - 最后提取对应
FEATURE下的FVALUE值。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

