【问题标题】:Update XmlDocument with XElement without using XDocument在不使用 XDocument 的情况下使用 XElement 更新 XmlDocument
【发布时间】:2016-05-24 14:35:32
【问题描述】:

这是我的 xml:

<settings>
  <Element Name="a" Attribute="b" />
  <Element Name="b" Attribute="c" />
</settings>

这是我的代码:

const string SettingsFileName = "settings.xml";
XmlDocument xmlDocument = new XmlDocument();
const string RootNode = "settings";
const string elementName = "Element";
const string attributeName = "Name";
const string attributeValue = "b";

xmlDocument.Load(SettingsFileName);
XElement xElement = XElement.Load(new XmlNodeReader(xmlDocument));

var entry = from element in xElement.Elements(elementName)
   where (string)element.Attribute(attributeName) == attributeValue
   select element;

string[] values = { "Attribute", "d" };

xElement = entry.First<XElement>();

for (int i = 0; i < values.Length; i++)
{
    string name = values[i++];
    string value = "";
    if (i < values.Length)
        value = values[i];
    xElement.Attribute(name).Value=value;
}

我想使用 XElement 更新 xmlDocument,最好不使用 XDocument。我似乎错过了一步,因为这不这样做:

xmlDocument.Save(SettingsFileName);

这可能吗?如果可以,怎么做?

【问题讨论】:

  • 编辑主题以强调:不使用XDocument
  • 一个简单的谷歌搜索会产生很多结果这里是一个示例供您查看stackoverflow.com/questions/18508765/…
  • 您需要再次将更改后的 XML 加载到 XmlDocument 中。你为什么要混合这两个 API?只需选择一个 - 最好是 LINQ to XML。
  • 谢谢,MethodMan。那和我一直在谷歌搜索的其他十几种可能的解决方案都不起作用。试着看看你找到的解决方案是否真的解决了问题,然后再说你已经解决了。

标签: c# xml


【解决方案1】:

想通了。这是解决方案:

const string SettingsFileName = "settings.xml";
XmlDocument xmlDocument = new XmlDocument();
const string RootNode = "settings";
const string elementName = "Element";
const string attributeName = "Name";
const string attributeValue = "b";

xmlDocument.Load(SettingsFileName);
XElement xElement = XElement.Load(new XmlNodeReader(xmlDocument));

var entry = from element in xElement.Elements(elementName)
   where (string)element.Attribute(attributeName) == attributeValue
   select element;

string[] values = { "Attribute", "d" };

XElement xElement0 = entry.First<XElement>();

for (int i = 0; i < values.Length; i++)
{
    string name = values[i++];
    string value = "";
    if (i < values.Length)
        value = values[i];
    xElement0.Attribute(name).Value=value;
}
xmlDocument.LoadXml(xElement.ToString());
xmlDocument.Save(SettingsFileName);

【讨论】:

  • 这太疯狂了。只需使用XDocument 而不是XmlDocument 加载它。您当前正在加载一个 DOM,从该 DOM 加载到另一个 DOM,进行更改,重新加载回第一个 DOM,然后保存。这非常效率低下。
【解决方案2】:

我并没有真正关注这里的“为什么”。你在做什么似乎很疯狂。坚持XDocument

var doc = XDocument.Load(SettingsFileName);

var attribute = doc
    .Descendants("Element")
    .Attributes("Attribute")
    .Single(x => x.Value == "b");

attribute.Value = "d";

doc.Save(SettingsFileName);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    相关资源
    最近更新 更多