簡體   English   中英

找不到商品名稱C#XML

[英]Cannot find item name C# XML

我的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);
}

簡而言之,我的問題是:程序找不到項目的處理類型,它確實找到了標簽,但是當要求顯示時,返回空/無顯示。

編輯:此外,在XMLhandling_type_flying中還包含在每個項目(例如汽車)中找不到的額外元素(例如推力),我希望程序也可以找到這些元素。 (這是我面臨的第二個問題,也許應該問第二個問題?)

需要修復的幾件事。

  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循環中調整查詢后,您需要調整循環以解決在新創建的對象上的循環。
  5. 注意,我從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序列化為一個對象。

如果您查看http://msdn.microsoft.com/zh-cn/library/system.xml.linq.xelement(v=vs.110).aspx,則ToString()方法不會返回標記的名稱,但縮進XML。

您應該改為使用Value屬性。 另外,您應該使用.equals(“ ...”)而不是==

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM