You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 23:05:03