2012-10-26 4 views
19

Ich habe ein XML-Dokument unten und es gibt einen Tag <FormData> in Seite dieses Tages als ein Attribut namens formid = „d617a5e8-b49b-4.640-9.734-bc7a2bf05691“Wie ändere ich den Wert eines Attributs in einem XML-Dokument?

genannt

Ich mag diesen Wert ändern in C# -Code?

XmlDocument xmlDoc = new XmlDocument(); 
    xmlDoc.Load(MapPath(tempFolderPathAlt + "dvforms" + "\\XmlDataTemplate.xml")); 
    //Change value of FormID 
    xmlDoc.Save(tempFolderPath + "data.xml"); 

Schreiben ist mein XML-Dokument:

<?xml version="1.0"?> 
<FormData Platform="Android" PlatformVersion="100" Version="966" DataVersion="1" Description="Investec - Res" FormId="d617a5e8-b49b-4640-9734-bc7a2bf05691" FileId="e6202ba2-3658-4d8e-836a-2eb4902d441d" EncryptionVerification="" CreatedBy="Bob" EditedBy="Bob"> 
<FieldData> 
<request_details_export_template Mod="20010101010101" IncludeInPDFExport="Yes"></request_details_export_template> 
<request_details_reason_for_valuatio Mod="20010101010101" IncludeInPDFExport="Yes"></request_details_reason_for_valuatio> 
</FieldData> 
<Photos Mod="20010101010101"/> 
<VoiceNotes/> 
<Drawings Mod="20010101010101"/> 
<FieldNotes/> 
</FormData> 

Antwort

23

Es gibt mehrere Möglichkeiten, dies zu tun, einschließlich:

XmlAttribute formId = (XmlAttribute)xmlDoc.SelectSingleNode("//FormData/@FormId"); 
if (formId != null) 
{ 
    formId.Value = "newValue"; // Set to new value. 
} 

Oder diese:

XmlElement formData = (XmlElement)xmlDoc.SelectSingleNode("//FormData"); 
if (formData != null) 
{ 
    formData.SetAttribute("FormId", "newValue"); // Set to new value. 
} 

Die SelectSingleNode Methode benutzt XPath um das zu finden Knoten; Es gibt ein gutes Tutorial über XPath here. Die Verwendung von SetAttribute bedeutet, dass das FormId-Attribut erstellt wird, wenn es nicht bereits vorhanden ist, oder aktualisiert wird, wenn es bereits vorhanden ist.

In diesem Fall geschieht Formdata das Stammelement des Dokuments sein, so können Sie dies auch tun:

xmlDoc.DocumentElement.SetAttribute("FormId", "newValue"); // Set to new value. 

Dieses letzte Beispiel wird nur funktionieren, wenn der Knoten, den Sie ändern sich geschieht in das Wurzelelement zu sein das Dokument.

Um einen bestimmten formid guid übereinstimmen (es ist nicht klar, ob dies ist, was Sie wollten):

XmlElement formData = (XmlElement)xmlDoc.SelectSingleNode("//FormData[@FormId='d617a5e8-b49b-4640-9734-bc7a2bf05691']"); 
if (formData != null) 
{ 
    formData.SetAttribute("FormId", "newValue"); // Set to new value. 
} 

Beachten Sie, dass die Auswahl in diesem letzten Beispiel das Element Formdata zurückgibt und nicht die formid Attribut; Der Ausdruck in [] Klammern ermöglicht es uns, nach einem Knoten mit einem bestimmten Übereinstimmungsattribut zu suchen.

+1

+1 Für XPaths empfehlen, gibt es eine Fülle von Informationen zu Google auf XPaths und es ist normalerweise besser, als zu versuchen, jeden Knoten zu durchlaufen. –

+0

Danke gute Antwort +1 – Pomster

1

Oder man könnte den Baum explizit gehen:

xmlDoc.DocumentElement.GetAttribute("FormId").Value = ""; 
+0

+1. Beachten Sie, dass davon ausgegangen wird, dass das FormId-Attribut bereits vorhanden ist; alternativ "xmlDoc.DocumentElement.SetAttribute (" FormId "," newValue ");" fügt die FormId hinzu, wenn sie nicht bereits vorhanden ist, oder ändert sie, falls dies der Fall ist. – Polyfun

+0

Yup, das ist ein sehr einfaches Beispiel, aber Sie können es für Ihren eigenen Zweck ändern. – Davio

4

die richtigen Knoten Verwendung folgenden XPath //Node[@Attribute='value'] auszuwählen.

In Ihrem Fall das fehlende Stück Code könnte wie folgt aussehen:

var formId = "d617a5e8-b49b-4640-9734-bc7a2bf05691"; 
var newId = "[set value here]"; 

var xpath = String.Format("//FormData[@FormId='{0}']", formId); 

XmlNode node = xmlDoc.SelectSingleNode(xpath); 

if(node != null) 
{ 
    node.Attributes["FormId"].Value = newId; 
} 

Siehe XPath reference oder diese tutorial überprüfen.

+0

+1 für die Suche nach einer FormId, die einer bestimmten GUID entspricht. – Polyfun

1
XDocument doc = XDocument.Load(m_pFileName);     
XElement xElemAgent = doc.Descendants("TRAINEE") 
.Where(arg => arg.Attribute("TRAINEEID").Value == m_pTraineeID.ToString()).Single(); 
xElemAgent.SetAttributeValue("FIRSTNAME",m_pFirstName); 
xElemAgent.SetAttributeValue("LASTNAME", m_pLastName); 
xElemAgent.SetAttributeValue("DOB",m_pDOB); 
xElemAgent.SetAttributeValue("UNIQUEID",m_pUniqueID); 
doc.Save(m_pFileName); 
1

der beste Weg, eine Funktion verwenden können, erstellen ist, die überall wiederverwendet werden, die Sie mögen:

public void ReplaceXMLAttributeValueByIndex(string fullFilePath, string nodeName, int index, string valueToAdd) 
    { 
     FileInfo fileInfo = new FileInfo(fullFilePath); 
     fileInfo.IsReadOnly = false; 
     fileInfo.Refresh(); 

     XmlDocument xmldoc = new XmlDocument(); 
     xmldoc.Load(fullFilePath); 
     try 
     { 
      XmlNode node = xmldoc.SelectSingleNode(nodeName); 
      node.Attributes[index].Value = valueToAdd; 
     } 
     catch (Exception ex) 
     { 
      //add code to see the error 
     } 
     xmldoc.Save(fullFilePath); 
    } 
Verwandte Themen