PDA

View Full Version : خواندن و ويرايش يك Attributte در يك node در يك فايل XML



amin.honest
سه شنبه 17 آذر 1388, 14:31 عصر
سلام و خسته باشيد به همه دوستان
من در فايل XML مي خوام در يك Node مقدار يك Attribute رو عوض كنم
به عنوان مثال يك همچين چيزي داريم

<?xml version="1.0" encoding="UTF-8"?>
<assetTracking>
<assets>
<asset>
<assetID assetIDStatus=""></assetID>
<assetDescription assetDescriptionStatus=""></assetDescription>
</asset>
</assets>
</assetTracking>

من مي خوام به عنوان مثال در يك Node به نام assetID مقدار Attribute به نام assetIDStatus رو عوض كنم :ناراحت:

mehdi.mousavi
سه شنبه 17 آذر 1388, 15:23 عصر
سلام و خسته باشيد به همه دوستان من مي خوام به عنوان مثال در يك Node به نام assetID مقدار Attribute به نام assetIDStatus رو عوض كنم :ناراحت:

سلام.
کنترل خطاها رو خودتون به کد اضافه کنید:


XmlDocument doc = new XmlDocument();
doc.Load("myxml.xml");
XmlNode node = doc.SelectSingleNode("//assetTracking/assets/asset/assetID");
if (node != null)
node.Attributes["assetIDStatus"].Value = "whatever";

doc.Save("newxml.xml");

amin.honest
سه شنبه 17 آذر 1388, 15:48 عصر
ممنون
اين كار مي كنه حالا
اگه من بخوام بدون دادن xPath ("//assetTracking/assets/asset/assetID)
به اون node دسترسي داسته باشم ميشه !
يعني فقط assetID و assetIDStatus رو داشته باشم بعد مقدار رو عوض كنم !
اين مدلي مي تونم مقدار دهي انجام بدم؟ راهي داره ؟
ممنون !

mehdi.mousavi
سه شنبه 17 آذر 1388, 15:58 عصر
ممنون اين كار مي كنه حالا
اگه من بخوام بدون دادن xPath ("//assetTracking/assets/asset/assetID)
به اون node دسترسي داسته باشم ميشه ! يعني فقط assetID و assetIDStatus رو داشته باشم بعد مقدار رو عوض كنم ! اين مدلي مي تونم مقدار دهي انجام بدم؟ راهي داره ؟ ممنون !

سلام.
منظورتون چیه بدون دادن اون XPATH ...؟ لطفا XML مورد نظر رو اینجا قرار بدید و بگید دقیقا چیکار میخواهید کنید تا راهنمایی کنم.

amin.honest
سه شنبه 17 آذر 1388, 16:31 عصر
ببخشيد اگه خوب توضيح ندادم
شما ورودي متد SelectSingleNode رو يك مسير داديد به اين صورت //assetTracking/assets/asset/assetID
شما براي بدست آوردن node مورد نظر اين مسير رو داديد
من اين مسير رو ندارم و فكر كنيد ساختار XML متغيره ...
من مي گم مي خوام بدون دادن اين مسير مقدار رو عوض كنم يعني فقط assetID و assetIDStatus رو داشته باشم بعد مقدار رو عوض كنم !
XML هم همون XML اولي كه گذاشتم
اگه توضيح خيلي واضح نيست بگين بيشتر توضيح بدم
ممنون

mehdi.mousavi
سه شنبه 17 آذر 1388, 16:41 عصر
ببخشيد اگه خوب توضيح ندادم
شما ورودي متد SelectSingleNode رو يك مسير داديد به اين صورت //assetTracking/assets/asset/assetID
شما براي بدست آوردن node مورد نظر اين مسير رو داديد
من اين مسير رو ندارم و فكر كنيد ساختار XML متغيره ...
من مي گم مي خوام بدون دادن اين مسير مقدار رو عوض كنم يعني فقط assetID و assetIDStatus رو داشته باشم بعد مقدار رو عوض كنم ! XML هم همون XML اولي كه گذاشتم اگه توضيح خيلي واضح نيست بگين بيشتر توضيح بدم
ممنون

سلام.
خوب اگر assetID جای دیگه ای در XML شما تکرار نمیشه، میتونید XPATH مزبور رو اینطور بنویسید:

XmlNode node = doc.SelectSingleNode("//assetID");

کد فوق بازهم باعث select شدن اولین نودی میشه که المنتش assetID هست... همون چیزی که شما میخواهید. اما من این کد رو با توجه به XML ای که ارسال کردید نوشتم... اگر بازهم منظورتون چیز دیگه ای بوده، بیشتر توضیح بدید تا حلش کنم.

موفق باشید.

amin.honest
چهارشنبه 18 آذر 1388, 09:08 صبح
ممنون اين روشي كه گفتيد جواب داد
حالا يك مشكلي پيش اومده اگه Node هاي من به جاي assetID مثلا my:assetID باشه اين Error رو ميده

Namespace Manager or XsltContext needed. This query has a prefix, variable, or user-defined function.
و يك سوال ديگه اگه بخوام مقدار Value همون Node كه اسمش assetID هست رو عوض كنم بازم Error ميده !


node.Value = "Changed"

Error

Cannot set a value on node type 'Element'

amin.honest
چهارشنبه 18 آذر 1388, 09:28 صبح
الان موفق شدم يكي از مشكلات رو حل كنم

ممنون اين روشي كه گفتيد جواب داد
حالا يك مشكلي پيش اومده اگه Node هاي من به جاي assetID مثلا my:assetID باشه اين Error رو ميده

کد:
Namespace Manager or XsltContext needed. This query has a prefix, variable, or user-defined function.



XmlNamespaceManager man = newXmlNamespaceManager(doc.NameTable);
man.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2005-10-21T21:12:27");
XmlNode node = doc.SelectSingleNode("//my:assetID", man);
if (node != null)
node.Attributes["my:assetIDStatus"].Value = "whatever";

حالا اين يكي رو چه كار كنم!

و يك سوال ديگه اگه بخوام مقدار Value همون Node كه اسمش assetID هست رو عوض كنم بازم Error ميده !

کد:
node.Value = "Changed"
Error

کد:
Cannot set a value on node type 'Element'

اين هم نمونه فايل XML

<?xml version="1.0" encoding="UTF-8"?>
<my:assetTracking xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2005-10-21T21:12:27">
<my:assets>
<my:asset>
<my:assetID my:assetIDStatus="whatever">
</my:assetID>
<my:assetDescription my:assetDescriptionStatus="">
</my:assetDescription>
</my:asset>
</my:assets>
</my:assetTracking>

amin.honest
چهارشنبه 18 آذر 1388, 09:41 صبح
مشكل آخر رو هم حل كردم !
به جاي
node.Value = "Changed";
بايد از
node.InnerText = "Changed"; استفاده كنم