2016-03-13 36 views
0
<imgdir name="02380000"> 
    <imgdir name="info"> 
     <canvas name="icon" width="32" height="32"> 
      <vector name="origin" x="0" y="32"/> 
     </canvas> 
     <canvas name="iconRaw" width="27" height="38"> 
      <vector name="origin" x="0" y="38"/> 
     </canvas> 
     <int name="price" value="1"/> 
     <int name="tradeBlock" value="1"/> 
     <int name="bigSize" value="1"/> 
     <int name="only" value="1"/> 
     <int name="monsterBook" value="1"/> 
     <int name="mob" value="100100"/> 
    </imgdir> 
    <imgdir name="spec"> 
     <int name="consumeOnPickup" value="1"/> 
    </imgdir> 
</imgdir> 

大家好,我嘗試只得到2特定的數據行,但遺憾的是它不工作了,因爲我想很想有一定的幫助; 3XML文件,探索和值執行

這是我的代碼

public void ReadValue_FromXML() 
    { 
     //==================================== 
     string Path = FilePathString_box.Text; 
     Path.Replace(@"\", @"\\"); 
     //==================================== 
     string ConnectionStringPath = ""; 
     MySqlConnection MySqlCon = new MySqlConnection(); 
     MySqlCon.ConnectionString = ConnectionStringPath; 
     string Update_MonsterCardsData = " INSERT INTO monstercarddata (id,cardid,mobid)VALUES(@Rowid,@CardNumber,@mob);"; 

     XmlDocument doc = new XmlDocument(); 
     doc.Load(Path); 
     int CountElements; 


     var elements = doc.SelectNodes("//imgdir"); 

     foreach (XmlNode node in elements) 
     { 

      string MonsterCardIDx; 
      string MobID; 
      if (ReadNameAndValue(node, out MobID)) 
      { 

       MonsterCardIDx = node.SelectSingleNode("./@name").InnerText; 
       if (MonsterCardIDx != "0238.img") 
       { 
        if (MobID != "") 
        { 

         int Row = 1; 
         ElementCount_lebel.Text = Row.ToString(); 
         int MonsterCard = Int32.Parse(MonsterCardIDx); 
         MySqlCommand MySqlComnd = new MySqlCommand(Update_MonsterCardsData, MySqlCon); 
         MySqlParameter MonsterCardID = new MySqlParameter("@CardNumber", MySqlDbType.Int32); 
         MonsterCardID.Value = MonsterCard; 
         MySqlComnd.Parameters.Add(MonsterCardID); 

         MySqlParameter MonsterID = new MySqlParameter("@mob", MySqlDbType.Int32); 
         MonsterID.Value = MobID; 
         MySqlComnd.Parameters.Add(MonsterID); 
         MySqlParameter RowID = new MySqlParameter("@Rowid", MySqlDbType.Int32); 
         RowID.Value = Row; 
         MySqlComnd.Parameters.Add(RowID); 

         try 
         { 
          MySqlCon.Open(); 
          MySqlComnd.ExecuteNonQuery(); 
          MySqlCon.Close(); 
          Row++; 


         } 
         catch (Exception ex) 
         { 
          MessageBox.Show(ex.ToString()); 
         } 
        } 
       } 
      } 

     } 

    } 

    private bool ReadNameAndValue(XmlNode parent, out string MobID) 
    { 

     MobID = ""; 

     var node = parent.SelectSingleNode("./imgdir"); 
     if (node == null) 
     { 
      return false; 
     } 

     try 
     { 
      if (parent.SelectSingleNode("./int/name").InnerText == "mob") 
      { 
       MobID = parent.SelectSingleNode("./int/value").InnerText; 
      } 

     } 
     catch (Exception) 
     { 
     } 

     return true; 
    } 

輸出我得到的是MonasterCard =02380000 and MobID=""

mobID應該100100

+0

方法ReadNameAndValue()有錯誤。不能沒有看到xml。 – jdweng

回答

0

UPDATE:

目前,你的代碼只檢查的parent第一個孩子<int>元素的name屬性,這就是爲什麼它沒有找到目標<int name="mob" value="100100"/>。我建議通過檢查其name屬性值使用XPath找到目標<int>,就像這樣:

var mobAttribute = parent.SelectSingleNode("./int[@name = 'mob']/@value"); 
if(mob != null) 
{ 
    MobID = mobAttribute.Value; 
} 

最初的回答:

你忘了之前的屬性名稱添加@使用XPath表達式的參考屬性:

if (parent.SelectSingleNode("./int/@name").InnerText == "mob") 
{ 
    MobID = parent.SelectSingleNode("./int/@value").InnerText; 
} 

沒有@符號,表達式仍然有效,但將引用子元素<name>,而不是屬性name。沒有這樣的元素,這就是爲什麼你空了MobID

+0

我忘了在這裏改變它;但在實際的代碼中,它是這樣的,仍然不起作用 – Extzy

0

請與這一個

var intNodes = node.SelectNodes("./int"); 
       foreach (var intNode in intNodes) 
       { 
        if (((XmlElement) intNode).Attributes["name"].Value == "mob") 
        { 
         MobID = ((XmlElement) intNode).Attributes["value"].Value; 
        } 
       } 

你的情況,你需要閱讀的屬性try塊中替換ReadNameAndValue方法你的代碼,而不是文本中的節點

+0

非常感謝你 – Extzy

0

使用LINQ。你有一個xml文件,其中有多個標籤「int」,你只需要名稱= mob的文件。這個更好用xml linq處理。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      string xml = 
        "<imgdir name=\"02380000\">" + 
         "<imgdir name=\"info\">" + 
          "<canvas name=\"icon\" width=\"32\" height=\"32\">" + 
           "<vector name=\"origin\" x=\"0\" y=\"32\"/>" + 
          "</canvas>" + 
          "<canvas name=\"iconRaw\" width=\"27\" height=\"38\">" + 
           "<vector name=\"origin\" x=\"0\" y=\"38\"/>" + 
          "</canvas>" + 
          "<int name=\"price\" value=\"1\"/>" + 
          "<int name=\"tradeBlock\" value=\"1\"/>" + 
          "<int name=\"bigSize\" value=\"1\"/>" + 
          "<int name=\"only\" value=\"1\"/>" + 
          "<int name=\"monsterBook\" value=\"1\"/>" + 
          "<int name=\"mob\" value=\"100100\"/>" + 
         "</imgdir>" + 
         "<imgdir name=\"spec\">" + 
          "<int name=\"consumeOnPickup\" value=\"1\"/>" + 
         "</imgdir>" + 
        "</imgdir>"; 

      XDocument doc = XDocument.Parse(xml); 

      foreach (XElement imgdir in doc.Elements("imgdir")) 
      { 
       string MobID = (string)imgdir.Descendants("int").ToList().Where(x => (string)x.Attribute("name") == "mob").FirstOrDefault().Attribute("value"); 
      } 
     } 
    } 
} 
+0

只是一個觀察,將您的代碼更改爲... MobID =(字符串)doc.Descendants(「int 「).ToList()。其中​​(x =>(字符串)x.Attribute(」name「)==」mob「)。FirstOrDefault()。Attribute(」value「); ...(doc替代imgdir)將消除對foreach循環的需求嗎? – Monty

+0

如果有多個父元素,我無法從XML中判斷。原代碼正在篩選非「0238」,這意味着不止一個父代。 – jdweng