使用 C 找到具有特定值的 XML 节点#

Find XML-Node with certain value with C#

提问人:George 提问时间:5/12/2023 更新时间:5/12/2023 访问量:67

问:

给定一个结构如下的 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>
    

第一步,我想选择所有FT_NAME为“Breite”的 FEATURE 元素。之后,我想获得该功能的 FVALUE。

我尝试使用


XElement root = XElement.Load("File.xml");
IEnumerable<XElement> elements =
    from el in root.Elements("FEATURE")
    where (string)el.Element("FT_NAME") == "Breite"
    select el;

但我没有得到任何结果。

C# XML LINQ XML节点

评论


答:

1赞 Jon Skeet 5/12/2023 #1

这里有几个问题:

  • Elements仅返回直接子元素 - 而不是所有后代。根文档不包含任何作为直接子元素的元素,也不包含作为直接子元素的元素。你可以用它来代替FEATUREFEATUREFT_NAMEDescendantsElements
  • 您的元素都在命名空间中,但您尚未在任何地方指定该元素。http://www.bmecat.org/bmecat/2005+onto

下面是修复这两个问题的代码示例:

XNamespace ns = "http://www.bmecat.org/bmecat/2005+onto";
// Used XDocument instead of XElement as really that's
// what your file contains
var doc = XDocument.Load("Test.xml");

var elements =
    from el in doc.Descendants(ns + "FEATURE")
    where (string) el.Descendants(ns + "FT_NAME").SingleOrDefault() == "Breite"
    select el;

foreach (var element in elements)
{
    Console.WriteLine(element.Element(ns + "FTEMPLATE").Element(ns + "FT_ID").Value);
}