提问人: 提问时间:1/28/2013 最后编辑:Omar 更新时间:1/29/2013 访问量:528
更改 XML 元素属性值时出现 NullReferenceException
NullReferenceException when changing XML element attribute value
问:
这是我更改XML元素属性值的方法:
using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
{
XDocument xml = null;
using (IsolatedStorageFileStream isoFileStream = myIsolatedStorage.OpenFile("Stats_file.xml", FileMode.Open, FileAccess.Read))
{
xml = XDocument.Load(isoFileStream, LoadOptions.None);
xml.Element("statrecords").SetElementValue("value", "2"); //nullreferenceexception
}
using (IsolatedStorageFileStream isoFileStream = myIsolatedStorage.OpenFile("Stats_file.xml", FileMode.Truncate, FileAccess.Write))
{
xml.Save(isoFileStream, SaveOptions.None);
}
}
在第 7 行中,我有 NullReferenceException。您知道如何无误地更改值吗?
这是我的XML文件:
<?xml version='1.0' encoding='utf-8' ?>
<stats>
<statmoney index='1' value='0' alt='all money' />
<statrecords index='2' value='0' alt='all completed records' />
</stats>
答:
1赞
Jon Skeet
1/28/2013
#1
有两个问题。
你得到一个原因是它会尝试找到一个名为 的根元素,而根元素被称为 。NullReferenceException
xml.Element("statrecords")
statrecords
stats
第二个问题是,您尝试设置元素值,而想要更改属性值,因此应使用 SetAttributeValue
。
我想你想要:
xml.Root.Element("statrecords").SetAttributeValue("value", 2);
编辑:我给出的代码适用于您提供的示例 XML。例如:
using System;
using System.Xml.Linq;
class Program
{
static void Main(string[] args)
{
var xml = XDocument.Load("test.xml");
xml.Root.Element("statrecords").SetAttributeValue("value", 2);
Console.WriteLine(xml);
}
}
输出:
<stats>
<statmoney index="1" value="0" alt="all money" />
<statrecords index="2" value="2" alt="all completed records" />
</stats>
评论
0赞
1/28/2013
谢谢,但仍然是例外。如果您知道更改此值的其他方法,请与我分享:)
0赞
Jon Skeet
1/29/2013
@ŁukaszWróblewski:“它仍然例外”并不足以帮助您。什么例外?哪里?你能发布一个简短但完整的程序来演示这个问题吗?您进行了多少诊断?
0赞
Omar
1/28/2013
#2
如果在这种情况下使用,则将获得根元素。因此,您应该使用 Descendants
() 和 SetAttributeValue()
方法:xml.Element()
var elements = xml.Descendants( "stats" ).Elements( "statrecords" ).ToList();
//becuase you can have multiple statrecords
elements[0].SetAttributeValue("value", "2" );
评论
0赞
1/29/2013
我有这个错误:无法将带有 [] 的索引应用于“System.Collections.Generic.IEnumerable<System.Xml.Linq.XElement> 类型的表达式
0赞
1/29/2013
感谢您的回复,请检查一下: img803.imageshack.us/img803/1996/errorgl.png
0赞
Omar
1/29/2013
这意味着列表中没有元素。我测试了我的代码并且它可以工作,所以你确定你正在加载正确的xml文件并且它包含该节点吗?
0赞
1/29/2013
我已将“statrecords”元素和“statmoney”元素都更改为“stat”,并在代码中将其更改为“elements[1]”。感谢您的帮助,它:)
1赞
Jon Skeet
1/29/2013
这里没有必要使用,或者.如果 XML 如 OP 的问题所示,则使用应该可以正常工作(而且更简单)。Descendants
Elements
xml.Root.Element
评论