在XML中寻找后代

时间:2014-08-12 02:50:52

标签: c# xml

我的C#API遇到了这个问题,但遗憾的是我发错了&得到了部分错误的答案,所以我要再试一次,因为我还没有解决它(尝试几个小时)

这是我的XML文件:

<CHandlingDataMgr>
    <HandlingData>
        <Item type="CHandlingData">
            <handlingName>Plane</handlingName>
            <fMass value="140000.000000" />
            <SubHandlingData>
                <Item type="CFlyingHandlingData">
                    <handlingType>HANDLING_TYPE_FLYING</handlingType>
                    <fThrust value="0.630000" />
            </SubHandlingData>
 </Item>
        </Item>

请注意:SubHandlingData位于同一项目的单独子部分中,调用第二个项目类型。

这是C#代码:

private void button2_Click(object sender, EventArgs e)
{
    var items = doc.Descendants("HandlingData").Elements("Item");
    var query = from i in items
                select new
                {
                    HandlingName = (string)i.Element("handlingName"),                             (decimal?)i.Element("fThrust").Attribute("value"),
                    HandlingType = (string)i.Element("handlingType")
                };

    StringBuilder test = new StringBuilder();
    foreach (var item in query)
    {
        var k = item.dunno;
        test.Append(k);
        richTextBox1.Text = test.ToString();
    }
}

上面的代码工作正常,但不适用于SubHandlingData。这意味着没有看到像HandlingType这样的值,我添加了这个&amp;的元素。它返回错误,也尝试包括多个后代,然后找不到HandlingName或HandlingType。我希望我的输出是在handlingType ==“HANDLING_TYPE_FLYING”,richtextbox1.text = this.HandlingName。我希望我已经清楚地解释了这一点,以获得答案,因为这让我困扰了一段时间。

我的问题简而言之:程序在我的XML文档中找不到任何SubHandlingData。

简而言之:如何在<SubHandlingData>内找到<item>(如何在同一项目中查找代码的子部分)

1 个答案:

答案 0 :(得分:3)

从@ Matthew的编辑中,您可以看到<Item>内的<SubHandlingData>未关闭。如果您的实际XML具有这样的结构,那么它将无法成功解析为XDocument。但是,如果您的实际XML已关闭,那么我假设:

<HandlingData>
   <Item type="CHandlingData">
      <handlingName>Plane</handlingName>
      <fMass value="140000.000000" />
      <SubHandlingData>
         <Item type="CFlyingHandlingData">
            <handlingType>HANDLING_TYPE_FLYING</handlingType>
            <fThrust value="0.630000" />
         </Item>
      </SubHandlingData>
   </Item>
</HandlingData>

...然后我们可以继续。您可以尝试按照从外ItemhandlingType的路径,即:SubHandlingData&gt;项目&gt; handlingType,从当前外部项获取handlingType数据:

var query = from i in items
            select new
            {
               HandlingName = (string)i.Element("handlingName"),
               HandlingType = (string)i.Element("SubHandlingData")
                                       .Element("Item")
                                       .Element("handlingType")
            };