无法找到项目名称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)中找到的额外元素,例如推力,我希望程序也能找到这些元素。(这是我面临的第二个问题,也许应该问第二个问题?)
需要解决的几个问题。
- 您没有在foreach循环中使用查询。
foreach (var item in query)
- 你的元素有一个大写的"H",但应该是小写的"handlingType"。
HandlingType = (string)i.Element("handlingType"),
- 你没有拉出fMass元素的Attribute值。
Mass = i.Element("fMass").Attribute("value").Value
- 一旦你在foreach循环中调整了你的Query,你就需要调整循环来考虑你新制作的对象的循环。 注意,我从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);
}