2012-12-23 209 views
0

我有以下XML文件用C#編輯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> 

我想從Password123密碼更改爲NewPassword123 的XML應該在兩個地方進行更改:

<Params Key="Password" Value="Password123"> 

<Value>Password123</Value> 

這怎麼辦?

編輯 XML已經存在,不是我的設計。我只是需要改變它

我試圖使用XDocument,但我有問題的查詢。 你能提供一個知道如何查詢它的linq嗎?

+1

你是什麼意思?爲什麼你將XML文件設計爲具有這種冗餘?對我來說這似乎是一個壞主意。什麼是生成這個文件? (我不希望XmlSerializer這樣做......) –

+0

請參閱我的編輯,謝謝 – user829174

+2

好吧,所以它根本不是關於序列化和反序列化(與您的標題相反) - 它只是關於編輯XML文件?你有什麼嘗試? –

回答

1

如何使用LINQ to 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; 
} 

之後,您可以將文檔保存到任何你想要的地方。

我現在無法測試,但總體思路應該清楚。

0

這將是一種方法 - 使用「舊」風格XmlDocument類,它將整個XML加載到內存中,並允許您「圍繞」其結構進行「導航」。如果您的XML不是太大(如此處),則可以正常工作。

// 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"); 
    } 
} 
0

這是很容易與System.Xml.XmlDocument:

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); 

希望這有助於你。