C# 用c语言编辑xml文件#

C# 用c语言编辑xml文件#,c#,xml-parsing,C#,Xml Parsing,我有以下xml文件 <?xml version="1.0" encoding="utf-8"?> <ArrayOfParams xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Params Key="Domain" Value="User123"> <Variable> &

我有以下xml文件

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfParams xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Params Key="Domain" Value="User123">
    <Variable>
      <Name>Domain</Name>
      <Type>String</Type>
      <Value>User123</Value>
    </Variable>
  </Params>
  <Params Key="Password" Value="Password123">
    <Variable>
      <Name>Password</Name>
      <Type>String</Type>
      <Value>Password123</Value>
    </Variable>
  </Params>
  <Params Key="Username" Value="Domain123">
    <Variable>
      <Name>Username</Name>
      <Type>String</Type>
      <Value>Domain123</Value>
    </Variable>
  </Params>
</ArrayOfParams>

密码123 如何做到这一点

编辑XML已经存在,不是我的设计。我只需要换一下

我尝试使用XDocument,但查询有问题。
您能提供一个知道如何查询它的linq吗?

使用linq转换XML怎么样

var doc = XDocument.Parse(xmlString);

var passwordParams = doc.Root.Elements("Params").SingleOrDefault(e => (string)e.Attribute("Key") == "Password");

if(passwordParams != null)
{
    passwordParams.Attribute("Value").Value = newPasswordString;
    passwordParams.Element("Variable").Element("Value").Value = ewPasswordString;
}
之后,您可以将文档保存到任何需要的位置


我现在无法测试它,但总体思路应该很清楚。

这是一种方法——使用“旧”样式的
XmlDocument
类将整个XML加载到内存中,并允许您在其结构中“导航”。如果您的XML不是太大(如这里),则可以正常工作

//创建XML文档并从文件加载内容
XmlDocument xdoc=新的XmlDocument();
xdoc.Load(@“D:\temp\test.xml”);//适应你自己的道路!
//获取具有Key=Password属性的节点
XmlNode paramsNode=xdoc.SelectSingleNode(“/ArrayOfParams/Params[@Key='Password']”);
if(paramsNode!=null)
{
//将“value”属性的值设置为新密码
paramsNode.Attributes[“Value”].Value=“NewPassword123”;
//获取该节点下的“变量/值”子节点
XmlNode valueSubnode=paramsNode.SelectSingleNode(“变量/值”);
if(valueSubnode!=null)
{
valueSubnode.InnerText=“NewPassword123”;
//将XmlDocument保存回新文件名
xdoc.Save(@“D:\temp\modified.xml”);
}
}

使用System.Xml.Xml文档非常简单:

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(source);
XmlNode password = xmlDocument.SelectSingleNode("//Params[@Key='Password']");
password.Attributes["Value"] = "NewPassword123";
XmlNode value = password.SelectSingleNode("./Value");
value.InnerXml = "NewPassword123";
string source = xmlDocument.OuterXml;
xmlDocument.Save(destPath);

希望这对你有帮助。

你是什么意思?为什么要将XML文件设计成这样的冗余?我觉得这是个坏主意。生成此文件的是什么?(我不希望XmlSerializer这样做…)请看我的编辑,谢谢,所以它实际上根本不是关于序列化和反序列化的(与您的标题相反)-它只是关于编辑一个XML文件?您尝试过什么?您尝试过使用XpathNavigator查找节点并对其进行编辑吗?只需使用c#中提供的多种XML解析方法之一:XpathNavigator、XDocument、XmlDocument等。您尝试过什么?
var doc = XDocument.Parse(xmlString);

var passwordParams = doc.Root.Elements("Params").SingleOrDefault(e => (string)e.Attribute("Key") == "Password");

if(passwordParams != null)
{
    passwordParams.Attribute("Value").Value = newPasswordString;
    passwordParams.Element("Variable").Element("Value").Value = ewPasswordString;
}
// create XML document and load contents from file
XmlDocument xdoc = new XmlDocument();
xdoc.Load(@"D:\temp\test.xml");   // adapt this to your own path!

// get the <Params> node with the Key=Password attribute
XmlNode paramsNode = xdoc.SelectSingleNode("/ArrayOfParams/Params[@Key='Password']");

if (paramsNode != null)
{
    // set the value of the "Value" attribute to the new password
    paramsNode.Attributes["Value"].Value = "NewPassword123";

    // get the "Variable/Value" subnode under that <Params> node
    XmlNode valueSubnode = paramsNode.SelectSingleNode("Variable/Value");

    if (valueSubnode != null)
    {
       valueSubnode.InnerText = "NewPassword123";

       // save XmlDocument back out to a new file name
       xdoc.Save(@"D:\temp\modified.xml");
    }
}
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(source);
XmlNode password = xmlDocument.SelectSingleNode("//Params[@Key='Password']");
password.Attributes["Value"] = "NewPassword123";
XmlNode value = password.SelectSingleNode("./Value");
value.InnerXml = "NewPassword123";
string source = xmlDocument.OuterXml;
xmlDocument.Save(destPath);