gpt4 book ai didi

windows - 使用 Linq to XML 将 XElement 添加到 XML 文件

转载 作者:可可西里 更新时间:2023-11-01 09:35:02 24 4
gpt4 key购买 nike

我尝试使用 Linq to XML 将 XElement 添加到现有 XML 文件。它必须在 Windows Phone .NET 框架中完成。目前我的 XML 文件如下所示:

    <?xml version="1.0" encoding="utf-8"?>
<Kids>
<Child>
<Name>Kid1</Name>
<FirstName>hisname</FirstName>
</Child>
</Kids>

and my code looks like this:



using (IsolatedStorageFileStream stream =
new IsolatedStorageFileStream("YourKids.xml", fileMode, store))
{
XDocument x = XDocument.Load(stream);
XElement t = new XElement("Child",
new XElement("Name", pName),
new XElement("FirstName", pFirstname));

t.Add(from el in x.Elements()
where el == el.Descendants("Child").Last()
select el);

x.Save(stream);
}

this doesn't do what I want to achieve. I want to add a new "Child" element to the the exisiting XML file like this :

<?xml version="1.0" encoding="utf-8"?>
<Kids>
<Child>
<Name>Kid1</Name>
<FirstName>hisname</FirstName>
</Child>
<Child>
<Name>kid2</Name>
<FirstName>SomeName</FirstName>
</Child>
</Kids>

Could use some help because I am stuck ;-)

After the tips from GSerjo, my code looks like this now:

try
{

if (store.FileExists("YourKids.xml"))
{



using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream("YourKids.xml",FileMode.Open, store))
{


var x = XElement.Load(stream);
var t = new XElement("Child",
new XElement("Name", pName),
new XElement("FirstName", pFirstname)
);

x.Add(t);

x.Save(stream);




stream.Close();
return;
}

}
else
{



using (IsolatedStorageFileStream CreateIsf = new IsolatedStorageFileStream("YourKids.xml",FileMode.Create,store))
{

var xDoc = new XElement("Kids",
new XElement("Child",
new XElement("Name", pName),
new XElement("FirstName", pFirstname)
)

);

xDoc.Save(CreateIsf);
CreateIsf.Close();

return;
}
}
}
catch (Exception ex)
{
message = ex.Message;
}

这给了我一个像这样的 xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<Kids>
<Child>
<Name>test</Name>
<FirstName>test</FirstName>
</Child>
</Kids><?xml version="1.0" encoding="utf-8"?>
<Kids>
<Child>
<Name>test</Name>
<FirstName>test</FirstName>
</Child>
<Child>
<Name>testing</Name>
<FirstName>testing</FirstName>
</Child>
</Kids>

哪个仍然不正确,有人有什么想法吗?

最佳答案

初始xml文件

<?xml version="1.0" encoding="utf-8"?>
<Kids>
<Child>
<Name>Kid1</Name>
<FirstName>hisname</FirstName>
</Child>
</Kids>

以下代码向现有 xml 添加一个新子

    [Test]
public void Test()
{
string filPath = @"YourKids.xml";
var root = XElement.Load(filPath);
var newChild = new XElement("Child",
new XElement("Name", "NewName"),
new XElement("FirstName", "NewFirstName"));
root.Add(newChild);
root.Save(filPath);
}

结果 xml 文件

<?xml version="1.0" encoding="utf-8"?>
<Kids>
<Child>
<Name>Kid1</Name>
<FirstName>hisname</FirstName>
</Child>
<Child>
<Name>NewName</Name>
<FirstName>NewFirstName</FirstName>
</Child>
</Kids>

更新

保存错误,您应该将流长度设置为 0

解释

读取现有文件后,stream 不会删除任何数据

using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream("YourKids.xml",FileMode.Open, store))
{
var x = XElement.Load(stream);

所以当你调用时,数据已经被追加

   x.Save(stream);
stream.Close();

x.Save(stream);之前添加stream.SetLength(0);,所有数据将被覆盖。

这里是完整版

            if (store.FileExists("YourKids.xml"))
{
using (var stream = new IsolatedStorageFileStream("YourKids.xml", FileMode.Open,
store))
{
var x = XElement.Load(stream);
var t = new XElement("Child",
new XElement("Name", pName),
new XElement("FirstName", pFirstname)
);
x.Add(t);
stream.SetLength(0);
x.Save(stream);
stream.Close();
}
}
else
{
using (var CreateIsf = new IsolatedStorageFileStream("YourKids.xml", FileMode.Create, store))
{
var xDoc = new XElement("Kids",
new XElement("Child",
new XElement("Name", pName),
new XElement("FirstName", pFirstname)
)
);
xDoc.Save(CreateIsf);
CreateIsf.Close();
}
}

请注意:我删除了无用的 return 语句。

附言看看 resharper,它可以改进代码。

关于windows - 使用 Linq to XML 将 XElement 添加到 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11926007/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com