我正在开发一个项目,该项目要求将所有SQL连接和查询信息存储在XML文件中。为了使我的项目可配置,我试图创建一种方法让用户通过一系列文本框配置他的sql连接字符串信息(数据源,目录,用户名和密码)。然后,此输入将保存到SQL文档中的相应节点。
我可以从XML文件中获取当前信息,并在文本框中显示该信息以供用户查看和更正,但是在保存更改时遇到错误。
以下是我用来更新和保存xml文档的代码。
protected void submitBtn_Click(object sender, EventArgs e)
{
SPFile file = methods.web.GetFile("MyXMLFile.xml");
myDoc = new XmlDocument();
byte[] bites = file.OpenBinary();
Stream strm1 = new MemoryStream(bites);
myDoc.Load(strm1);
XmlNode node;
node = myDoc.DocumentElement;
foreach (XmlNode node1 in node.ChildNodes)
{
foreach (XmlNode node2 in node1.ChildNodes)
{
if (node2.Name == "name1")
{
if (node2.InnerText != box1.Text)
{
}
}
if (node2.Name == "name2")
{
if (node2.InnerText != box2.Text)
{
}
}
if (node2.Name == "name3")
{
if (node2.InnerText != box3.Text)
{
node2.InnerText = box3.Text;
}
}
if (node2.Name == "name4")
{
if (node2.InnerText != box4.Text)
{
}
}
}
}
myDoc.Save(strm1);
}
此时大多数条件都是空的,因为我还在测试。
正如我所说,代码工作到最后一行都很好。此时,我收到错误“内存流不可扩展”。我知道使用内存流来更新存储的文件是不正确的,但我无法找到正确的方法来执行此操作。
我试图在Memory stream is not expandable处实现类似问题中给出的解决方案,但这种情况与我的情况不同,因此实施对我来说毫无意义。任何澄清将不胜感激。
答案 0 :(得分:0)
使用以字节数组作为参数的MemoryStream
构造函数创建MemoryStream
的不可调整大小的实例。由于您要对文件(以及基础字节)进行更改,因此需要可调整大小的MemoryStream
。这可以通过使用MemoryStream
类的无参数构造函数并将字节数组写入MemoryStream
来实现。
试试这个:
SPFile file = methods.web.GetFile("MyXMLFile.xml");
myDoc = new XmlDocument();
byte[] bites = file.OpenBinary();
using(MemoryStream strm1 = new MemoryStream()){
strm1.Write(bites, 0, (int)bites.Length);
strm1.Position = 0;
myDoc.Load(strm1);
// all of your edits to the file here
strm1.Position = 0;
// save the file back to disk
using(var fs = new FileStream("FILEPATH",FileMode.Create,FileAccess.ReadWrite)){
myDoc.Save(fs);
}
}
要获得Sharepoint文件的FILEPATH
,它就是这些内容(我现在没有设置Sharepoint开发环境):
SPFile file = methods.web.GetFile("MyXMLFile.xml")
var filepath = file.ParentFolder.ServerRelativeUrl + "\\" + file.Name;
或者可能更容易使用SaveBinary
类的SPFile
方法,如下所示:
// same code from above
// all of your edits to the file here
strm1.Position = 0;
// don't use a FileStream, just SaveBinary
file.SaveBinary(strm1);
我没有测试这段代码,但我在Sharepoint解决方案中使用它来修改Sharepoint列表中的XML(主要是OpenXML)文档。阅读this blogpost了解更多信息
答案 1 :(得分:0)
您可以考虑使用XDocument类而不是XmlDocument类。 http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspx
我更喜欢它,因为它简单,它不需要使用Memory Stream。
修改:您可以像这样附加到文件:
XDocument doc = XDocument.Load('filePath');
doc.Root.Add(
new XElement("An Element Name",
new XAttribute("An Attribute", "Some Value"),
new XElement("Nested Element", "Inner Text"))
);
doc.Save(filePath);
或者你可以搜索一个元素并像这样更新:
doc.Root.Elements("The element").First(m =>
m.Attribute("An Attribute").Value == "Some value to match").SetElementValue(
"The element to change", "Value to set element to");
doc.Save('filePath');