找不到项目名称C#XML

时间:2014-08-11 17:44:20

标签: c#

我的XML文档存在问题。

我希望我的程序能够找到XML文件中所有项的值,但前提是handleType属于某个特定字符串。

代码(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中包含额外的元素,例如在每个项目(例如汽车)中找不到的推力,我希望程序也能找到这些元素。 (这是我面临的第二个问题,也许应该问第二个问题?)

2 个答案:

答案 0 :(得分:3)

需要修复的几件事情。

  1. 您没有在foreach循环中使用查询。 foreach (var item in query)
  2. 您的元素有一个超级单词“H”,但应该是小写的“handlingType”。 HandlingType = (string)i.Element("handlingType"),
  3. 您没有提取fMass元素的属性值。Mass = i.Element("fMass").Attribute("value").Value
  4. 在foreach循环中调整查询后,您需要调整循环以解决在新制作的对象上的循环问题。
  5. 请注意,我从 Mass = i.Element(“fMass”)中删除了(十进制)。属性(“值”)。值
  6. 这是包含所有修复的代码。

      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序列化为对象。

答案 1 :(得分:0)

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

您应该使用Value属性。你也应该使用.equals(&#34; ...&#34;)而不是==

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