我的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中包含额外的元素,例如在每个项目(例如汽车)中找不到的推力,我希望程序也能找到这些元素。 (这是我面临的第二个问题,也许应该问第二个问题?)
答案 0 :(得分:3)
需要修复的几件事情。
foreach (var item in query)
HandlingType = (string)i.Element("handlingType"),
Mass = i.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序列化为对象。
答案 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);
}