2016-03-13 3 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> 

Привет всем, им пытаются получить только два конкретных строк данных, но, к сожалению, он не работает, как я хочу, хотел бы иметь некоторую помощь; 3XML файлы Exploration и значения исполнения ордеров

Это мой код

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:

В настоящее время, код проверяет только name атрибут первого ребенка <int> элемент parent, поэтому он не находит цель <int name="mob" value="100100"/>. Я хотел бы предложить использовать XPath, чтобы найти цель <int> путем проверки его name значение атрибута, например, так:

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

Пожалуйста, замените код в методе ReadNameAndValue в Ьгу блоке с этим одним

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

В вашем случае вам нужно прочитать атрибуты, но не текст внутри узлов

+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 = (string) doc.Descendants ("int ") .ToList(). Где (x => (строка) x.Attribute (" name ") ==" mob "). FirstOrDefault(). Attribute (" value "); ... (doc вместо imgdir) устранит необходимость в цикле foreach, не так ли? – Monty

+0

Я не могу сказать из предоставленного XML, если имеется более одного родительского элемента. Исходный код фильтрует для NOT «0238», что подразумевает более одного родителя. – jdweng

Смежные вопросы