Доброго времени суток.
Пишу программу которая будет в xml искать элемент по значению атрибута и результат будет заносить заносить в новый файл.
Код:
ArrayList orders = new ArrayList();
orders.Add("100001405");
orders.Add("100001406");
// Load the document and set the root element.
XmlDocument doc = new XmlDocument();
doc.Load("lex1.xml");
XmlNode root = doc.DocumentElement;
string FilePath = @"123.xml";
// Add the namespace.
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
for (int i = 0; i < orders.Count; i++)
{
XmlNodeList nodeList = root.SelectNodes(".//item_template[@id=\""+ orders[i] + "\"]", nsmgr);
Console.WriteLine(orders[i]);
}
doc.Save(FilePath);
// Display the updated document.
Console.ReadLine();
Код:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<item_templates>
<item_template id="100001405" name="world cash Gulare's Sword" level="60" mask="7240" category="SWORD" weapon_type="SWORD_1H" max_stack_count="1" item_type="NORMAL" quality="EPIC" price="3665400" race="PC_ALL" option_slot_bonus="0" restrict="60,60,60,60,60,60,60,60,60,60,60,60" restrict_max="63,63,63,63,63,63,63,63,63,63,63,63" desc="1604073" attack_gap="0.0" attack_type="PHYSICAL" slot="3" equipment_type="WEAPON">
<modifiers>
<add name="MAXHP" value="508" bonus="true"/>
</modifiers>
<weapon_stats hit_count="2" attack_range="4000" magical_accuracy="331" parry="1014" physical_accuracy="976" physical_critical="50" attack_speed="1400" max_damage="225" min_damage="183"/>
</item_template>
<item_template id="100001406" name="world cash Gulare's Sword" level="60" mask="7240" category="SWORD" weapon_type="SWORD_1H" max_stack_count="1" item_type="NORMAL" quality="EPIC" price="3665400" race="PC_ALL" option_slot_bonus="0" restrict="60,60,60,60,60,60,60,60,60,60,60,60" restrict_max="63,63,63,63,63,63,63,63,63,63,63,63" desc="1604073" attack_gap="0.0" attack_type="PHYSICAL" slot="3" equipment_type="WEAPON">
<modifiers>
<add name="MAXHP" value="508" bonus="true"/>
</modifiers>
<weapon_stats hit_count="2" attack_range="4000" magical_accuracy="331" parry="1014" physical_accuracy="976" physical_critical="50" attack_speed="1400" max_damage="225" min_damage="183"/>
</item_template>
<item_template id="100001407" name="world cash Gulare's Sword" level="60" mask="7240" category="SWORD" weapon_type="SWORD_1H" max_stack_count="1" item_type="NORMAL" quality="EPIC" price="3665400" race="PC_ALL" option_slot_bonus="0" restrict="60,60,60,60,60,60,60,60,60,60,60,60" restrict_max="63,63,63,63,63,63,63,63,63,63,63,63" desc="1604073" attack_gap="0.0" attack_type="PHYSICAL" slot="3" equipment_type="WEAPON">
<modifiers>
<add name="MAXHP" value="508" bonus="true"/>
</modifiers>
<weapon_stats hit_count="2" attack_range="4000" magical_accuracy="331" parry="1014" physical_accuracy="976" physical_critical="50" attack_speed="1400" max_damage="225" min_damage="183"/>
</item_template>
</item_templates>
Но у меня почему то в файл записываются все элементы заново а не элементы которые он должен был найти.
Код:
ArrayList orders = new ArrayList();
orders.Add("100001405"); //id
orders.Add("100001406"); //id
XmlDocument doc = new XmlDocument();
doc.Load("lex1.xml");
XmlNode root = doc.DocumentElement;
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
try
{
//ArrayList orders = new ArrayList() { 100001407 };
StringBuilder sb = new StringBuilder();
for (int i = 0; i < orders.Count; i++)
{
XDocument doc1 = XDocument.Load("123.xml");
string s = Convert.ToString(orders[i]);
Console.WriteLine(s);
var q = from node in doc1.Descendants("item_template") let attr = node.Attribute("id") where attr != null & attr.Value == s select node;
doc1.Save("123.xml");
}
}
catch (Exception e)
{
Console.WriteLine("The file could not be read:");
Console.WriteLine(e.Message);
}
Console.ReadLine();
Пробовал так тоже не работает все равно переписывает весь файл переписывает весь файл =(