无法找到项目名称c# XML

本文关键字:XML 项目 | 更新日期: 2023-09-27 18:17:25

我的XML文档有问题。

我想让我的程序在我的XML文件中找到项目的所有值,但只有当handlingType是特定的字符串。

代码(c#):
string path = "//files//handling.meta";
             var doc = XDocument.Load(path);
            var items = doc.Descendants("HandlingData").Elements("Item");
            var query = from i in items
                        select new
                         {
                             HandlingName = (string)i.Element("handlingName"),
                             HandlingType = (string)i.Element("HandlingType"),
                             Mass = (decimal?)i.Element("fMass")
                         };
            foreach (var HandlingType in items)
            {
                if (HandlingType.ToString() == "HANDLING_TYPE_FLYING")
                {
                    MessageBox.Show(HandlingType.ToString());
                }
            }

上面的代码演示了我想要发生的事情的简短版本,但是没有找到这个handlingType(不显示messageBox)

这是XML:

<CHandlingDataMgr>
    <HandlingData>
        <Item type="CHandlingData">
            <handlingName>Plane</handlingName>
            <fMass value="380000.000000"/>
            <handlingType>HANDLING_TYPE_FLYING</handlingType>
        </Item>
        <Item type="CHandlingData">
            <handlingName>Car1</handlingName>
            <fMass value="150000.000000"/>
            <handlingType>HANDLING_TYPE_DRIVING</handlingType>
        </Item>
    </HandlingData>
</CHandlingDataMgr>

如果包含特定的HandlingType,我希望输出显示handlingName例如

if (handlingType == "HANDLING_TYPE_FLYING") 
{
    messageBox.Show(this.HandlingName);
}

我的问题简而言之:程序没有找到项目的处理类型,它确实找到了标记,但当被要求显示时,返回空/显示为空。

编辑:同样在XML handling_type_flying中包含无法在每个项目(例如car)中找到的额外元素,例如推力,我希望程序也能找到这些元素。(这是我面临的第二个问题,也许应该问第二个问题?)

无法找到项目名称c# XML

需要解决的几个问题。

  1. 您没有在foreach循环中使用查询。foreach (var item in query)
  2. 你的元素有一个大写的"H",但应该是小写的"handlingType"。HandlingType = (string)i.Element("handlingType"),
  3. 你没有拉出fMass元素的Attribute值。Mass = i.Element("fMass").Attribute("value").Value
  4. 一旦你在foreach循环中调整了你的Query,你就需要调整循环来考虑你新制作的对象的循环。
  5. 注意,我从Mass =中删除了(十进制) . element ("fMass").Attribute("value").Value

是包含所有修复的代码。

  class Program
    {
        static void Main()
        {
            const string path = "//files//handling.meta";
            var doc = XDocument.Load(path);
            var items = doc.Descendants("HandlingData").Elements("Item");
            var query = from i in items
                        select new
                        {
                            HandlingName = (string)i.Element("handlingName"),
                            HandlingType = (string)i.Element("handlingType"),
                            Mass = i.Element("fMass").Attribute("value").Value
                        };
            foreach (var item in query)
            {
                if (item.HandlingType == "HANDLING_TYPE_FLYING")
                {
                    //Remove messagebox if consoleapp
                    MessageBox.Show(item.HandlingType);
                    MessageBox.Show(item.HandlingName);
                    Console.WriteLine(item.HandlingType);
                    Console.WriteLine(item.HandlingName);
                }
            }
        }
    }

我建议考虑将xml序列化为对象。

如果您查看http://msdn.microsoft.com/en-us/library/system.xml.linq.xelement(v=vs.110).aspx, ToString()方法不会返回标记的名称,而是返回缩进的XML。

你应该使用Value属性。另外,你应该使用。equals("…")而不是==

if (handlingType.Value.equals("HANDLING_TYPE_FLYING")
{
    messageBox.Show(this.handlingname);
}