Xml 不保存到文件

Posted

技术标签:

【中文标题】Xml 不保存到文件【英文标题】:Xml doesn't save to file 【发布时间】:2016-03-11 19:10:20 【问题描述】:

我在 Xamarin 中编写 android 应用程序

我有正在写入文件的 xml(已实现)

在不同的活动中,我尝试打开这个文件,替换一些字符串并保存

像这样打开文件

var doc2 = new XmlDocument();
        var documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
        var filePath = System.IO.Path.Combine(documentsPath, "myFile.xml");
        doc2.Load (filePath);

像这样替换一些字符串:

string str;
            str = doc2.OuterXml;

                str = str.Replace ("ProductCode", Code1);

            Console.WriteLine ("look");
            Console.WriteLine (str);

            doc2.Save (filePath);
            Console.WriteLine (doc2.OuterXml);

当我显示 str 时,我看到“ProductCode”发生了变化。

但是当我显示“doc2.OuterXML”时,我发现它没有保存。

这是“str”:

  <Order CallConfirm="1" PayMethod="Безнал" QtyPerson="" Type="2" PayStateID="0" Remark="Comment" RemarkMoney="0" TimePlan="" Brand="1" DiscountPercent="0" BonusAmount="0" Department=""><Customer Login="" FIO="FIO" /><Address CityName="CityName" StationName="" StreetName="StreetName" House="HouseName" Corpus="" Building="" Flat="FlatName" Porch="" Floor="" DoorCode="" /><Phone Code="Code" Number="Phone" /><Products><Product Code="398" Qty="QTY" /><Product Code="ProductCode1" Qty="QTY1" /><Product Code="ProductCode2" Qty="QTY2" /></Products></Order>

这是doc2.Save (filePath);之后的doc2:

<Order CallConfirm="1" PayMethod="Безнал" QtyPerson="" Type="2" PayStateID="0" Remark="Comment" RemarkMoney="0" TimePlan="" Brand="1" DiscountPercent="0" BonusAmount="0" Department=""><Customer Login="" FIO="FIO" /><Address CityName="CityName" StationName="" StreetName="StreetName" House="HouseName" Corpus="" Building="" Flat="FlatName" Porch="" Floor="" DoorCode="" /><Phone Code="Code" Number="Phone" /><Products><Product Code="ProductCode" Qty="QTY" /><Product Code="ProductCode1" Qty="QTY1" /><Product Code="ProductCode2" Qty="QTY2" /></Products></Order>

为什么不保存?

【问题讨论】:

请在格式化您的代码和 XML 方面付出更多努力。代码现在到处都是,每个 XML 文档都在一行中... 您需要将str 保存回doc2。 IE。 doc2.OuterXml = str。由于 c# 字符串是不可变的,Replace 调用返回一个新字符串而不是修改原始字符串。虽然我真的根本不会这样做,但我会使用XmlDocument API 本身来进行修改。 @dbc 当我写这个时,我有这个错误。错误 CS0200:无法将属性或索引器“System.Xml.XmlNode.OuterXml”分配给 -- 它是只读的 啊,你可能想使用InnerXml。或者根本不这样做,使用下面的XDocument。 (或者使用File.ReadAllText然后进行字符串替换。如果你要立即将它转回字符串,为什么还要解析XML?) 【参考方案1】:

您尚未修改文档。您已向文档询问其自身的字符串表示形式,然后将新字符串分配给同一变量 - 但这根本不会更改文档中的 XML。

我强烈建议您使用 LINQ to XML(这是一个更好的 XML API),此时您可以:

XDocument doc = XDocument.Load(filePath);
var query = doc.Descendants("Product")
               .Where(p => (string) p.Attribute("Code") == "ProductCode");
foreach (var element in query)

    element.SetAttributeValue("Code", Code1);

doc.Save(filePath);

【讨论】:

Xamarin 允许使用 XDocument 吗? @Eugene:是的,我敢肯定。 @Eugene:是的。您只需要正确的程序集引用和使用指令。 什么程序集参考?当我编写 XDocument 时,它更改为 XmlDocument @Eugene:嗯,你需要一个用于 System.Xml.Linq 的 using 指令开始......你可能会发现程序集引用已经存在。【参考方案2】:

你错过了一行

doc2.OuterXml = str;

你的代码在OuterXml里面是str

string str;
str = doc2.OuterXml;
str = str.Replace ("ProductCode", Code1);

然后你替换了 str 值而不是 doc2 值,所以它没有改变。所以现在你需要添加

string str;
str = doc2.OuterXml;
str = str.Replace ("ProductCode", Code1);

doc2.OuterXml = str;

现在你会看到 doc2.OuterXml 也会给你同样的结果。

【讨论】:

编译时出错。错误 CS0200:无法将属性或索引器“System.Xml.XmlNode.OuterXml”分配给 -- 它是只读的

以上是关于Xml 不保存到文件的主要内容,如果未能解决你的问题,请参考以下文章

.net 安全保存到 Xml 文件以防崩溃

如何将目录列表保存到xml文件C#

将大型 xml 字符串保存/读取到/从文件中

如何将静态字符串保存到 XML 文件?

Java 小程序不保存/加载内部 xml 文件

如何将本地保存的 xml 文件保存到 .plist 文件中