2017-02-07 15 views
0

私はXMLライブラリをコード化しましたが、なぜ私は 私のPCにあるXMLファイルを読むことができなかったのか分かりませんでした。私は約1.5MのXMLファイルを解析し、S​​QLに変換する必要があります。XMLからSQLへの変換C#

class XMLConverter 
     { 
      public string XMLConverterSQL(int ID, string lang) 
      { 
       // int i = ID; // Starting Elements 
       Stopwatch stopwatch = new Stopwatch(); 

       XmlDocument xml; 
       XmlElement element; 
       XmlNodeList nodes; 
       string result; 

       //Console.WriteLine(id_min); 
       //Console.WriteLine(id_max); 
       result = ""; 
       xml = new XmlDocument(); 
       xml.LoadXml("C:\\Users\\Phil1\\Desktop\\V1\\XMLDownloader\\bin\\Debug\\XMLData\\" + lang + "\\" + ID + ".xml"); 
       element = xml.DocumentElement; 
       nodes = element.SelectNodes("/wowhead"); 
       if (xml.SelectSingleNode("/wowhead/error") != null) 
       { 
        Console.WriteLine("Item ID {0} does not exist yet or not in WoWHead Database ", ID); 
       } 
       else 
       { 
       result += "INSERT INTO item_wh (entry, class, subclass, displayId, ,quality, name, level) VALUES ("; 
       foreach (XmlNode node in nodes) 
       { 
        // entry 
        result += node["item"].Attributes["id"].InnerText; 
        result += ", "; 
        // class 
        result += node["item"]["class"].Attributes["id"].InnerText; 
        result += ", "; 
        // subclass 
        result += node["item"]["subclass"].Attributes["id"].InnerText; 
        result += ", "; 
        // displayId 
        result += node["item"]["icon"].Attributes["displayId"].InnerText; 
        result += ", "; 
        // quality 
        result += node["item"]["quality"].Attributes["id"].InnerText; 
        result += ", \""; 
        // name 
        result += node["item"]["name"].InnerText; 
        result += "\", "; 
        // level 
        result += node["item"]["level"].InnerText; 
        result += ");"; 
        // bakcline 
        result += "\r\n"; 
        } 
       } 
       return (result); 
      } 
     } 

メイン::01​​はここに私のコードです

int min = int.Parse(txtMin_ID.Text); 
int max = int.Parse(txtMax_ID.Text); 
       List<string> results; 

       results = new List<string>(); 
       // ParseXML.CreateDictionary("en"); 
       // ParseWH.startParse(min, max); 
       var sTab = new ConcurrentBag<int>(Enumerable.Range(min, max + 1)); 
       Parallel.ForEach(sTab, (i) => 
       { 
        Task.Factory.StartNew(() => 
        { 
         string Convert = new XMLConverter().XMLConverterSQL(i, "EN"); 
         lock (results) 
         { 
          results.Add(Convert); 
         } 
        }); 
       }); 
       Task.WaitAny(); 
       File.WriteAllText("C:\\Users\\Phil1\\Desktop\\result.sql", String.Join("", results)); 

and here is an example of XML if have to read 

    <?xml version="1.0" encoding="UTF-8"?> 
    -<wowhead> 
    -<item id="105005"> 
    -<name> 
    -<![CDATA[Windfire Legplates]]> 
    </name> 
    <level>528</level> 
    <quality id="4">Epic</quality> 
    -<class id="4"> 
    +<![CDATA[]]> 
    </class> 
    +<subclass id="4"> 
    -<![CDATA[Plate Armor]]> 
    <icon displayId="127510">inv_plate_raidpaladin_n_01pant</icon> 
    <inventorySlot id="7">Legs</inventorySlot> 
    <upgrade id="491" level="0">0</upgrade> 
    -<htmlTooltip> 
    -<![CDATA[<table><tr><td><!--nstart--><b class="q4">Windfire Legplates</b><!--nend--><!--ndstart--><br /><span style="color: #00FF00">Raid Finder</span><!--ndend--><span style="color: #ffd100"><br />Item Level <!--ilvl-->528</span><br /><span style="color: #ffd100">Upgrade Level <!--uindex-->0/4</span><br /><!--bo-->Binds when picked up<table width="100%"><tr><td>Legs</td><th><!--scstart4:4--><span class="q1">Plate</span><!--scend--></th></tr></table><span><!--amr-->104 Armor</span><br /><span><!--stat5-->+57 Intellect</span><br /><span><!--stat7-->+97 Stamina</span><!--ebstats--><br /><span class="q2">+<!--rtg32-->33 Critical Strike&nbsp;<small>(<!--rtg%32-->0.08%&nbsp;@&nbsp;L<!--lvl-->110)</small></span><br /><span class="q2">+<!--rtg36-->43 Haste&nbsp;<small>(<!--rtg%36-->0.11%&nbsp;@&nbsp;L<!--lvl-->110)</small></span><!--egstats--><!--e--><br /><br /><a href="http://www.wowhead.com/items/gems?filter=81;9;0" class="socket-prismatic q0">Prismatic Socket</a><br /><a href="http://www.wowhead.com/items/gems?filter=81;9;0" class="socket-prismatic q0">Prismatic Socket</a><!--ps--><br /><!--sb--><span class="q0">Socket Bonus: +<!--ee16:0:90:750:0:0-->8 Intellect</span><br /><br />Durability 120/120</td></tr></table><table><tr><td>Requires Level <!--rlvl-->90<div class="whtt-sellprice">Sell Price: <span class="moneygold">34</span> <span class="moneysilver">79</span> <span class="moneycopper">3</span></div></td></tr></table><!--i?105005:1:110:90-->]]> 
    </htmlTooltip> 
    -<json> 
    -<![CDATA["appearances":{"0":[127510,""]},"armor":104,"attainable":2,"classs":4,"displayid":127510,"flags2":8192,"id":105005,"level":528,"name":"4Windfire Legplates","namedesc":"Raid Finder","raidfinder":1,"reqlevel":90,"slot":7,"slotbak":7,"specs":[65],"subclass":4,"upgrades":[4,8,12,16]]]> 
    </json> 
    -<jsonEquip> 
    -<![CDATA["appearances":{"0":[127510,""]},"armor":104,"critstrkrtng":33,"displayid":127510,"dura":120,"hastertng":43,"int":57,"nsockets":2,"reqlevel":90,"sellprice":347903,"slotbak":7,"socket1":7,"socket2":7,"socketbonus":4848,"sta":97]]> 
    </jsonEquip> 
    <link>http://www.wowhead.com/item=105005</link> 
    </item> 
    </wowhead> 

はより高速なパフォーマンスを得るために、私は本当に速いメモリ不足がConcurrentDictionaryにすべてのXMLをロードしようとした、すべてのXMLファイルが1程度ですそれぞれ9 KB。私は、ルートレベルで

データを受信

は無効です。ライン1位1

エラーは、しかし、ブレークポイントを設定し、正しく行くXMLコンバータコード用事、問題はタスクファクトリーを削除することで解決してしまった

+0

'-'あなたのタグでエラーが発生した場合は '+'が先頭に表示されます。 –

+0

私はXML形式にとどまりたいと思っていますが、リバースエンジニアリングをしている大学プロジェクト、同じプロジェクトでC#とSQLを一緒に練習しています。それを構築するために必要なデータを選ぶことができます。パズルを組み立てる前にすべての部分を構築するために残された唯一のものは、それらのXML上にあります。 –

+0

クリスチャンに感謝していますが、現時点ではXMLに表示されていません。私はブラウザ上でそれを公開しなければなりません。 "retract/show"オプションが表示されました。 –

答えて

1

を考えているようだ

var sTab = new ConcurrentBag<int>(Enumerable.Range(min, max)); 
Parallel.ForEach(sTab, (i) => 
      { 
       string Convert = new XMLConverter().XMLConverterSQL(i, "EN"); 
       lock (results) 
       { 
        results.Add(Convert); 
       } 
      });