2012-10-26 16 views
19

Mam dokumentu XML poniżej i jest nazywany <FormData> tag w bok ten tag go jako atrybut o nazwie FormId = „d617a5e8-b49b-4640-9734-bc7a2bf05691”Jak zmienić wartość atrybutu w dokumencie XML?

chciałbym zmienić tę wartość w kodzie C#?

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

Bądź mój dokument XML:

<?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> 

Odpowiedz

23

Istnieje kilka sposobów osiągnięcia tego celu, w tym:

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

albo to:

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

metody SelectSingleNode używa XPath, aby znaleźć węzeł; istnieje dobry samouczek dotyczący XPath here. Użycie SetAttribute oznacza, że ​​atrybut FormId zostanie utworzony, jeśli jeszcze nie istnieje, lub zaktualizowany, jeśli już istnieje.

W tym przypadku FormData dzieje się element główny dokumentu, więc można też to zrobić:

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

Ten ostatni przykład działa tylko w przypadku gdy węzeł zmieniasz dzieje się element główny w dokument.

Aby dopasować konkretny FormId GUID (nie jest jasne, czy to jest to, czego chciał):

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

Należy zauważyć, że w tym ostatnim select przykład zwraca element FormData a nie atrybut FormId; wyrażenie w nawiasach [] umożliwia nam wyszukiwanie węzła o określonym dopasowanym atrybucie.

+1

+1 polecając XPaths, jest mnóstwo informacji Google na XPath i zwykle jest to lepsze rozwiązanie niż próba przechodzenia przez każdy węzeł. –

+0

Dzięki wspaniałej odpowiedzi +1 – Pomster

1

Albo można iść na drzewo wyraźnie:

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

+1. Zauważ, że zakłada to, że atrybut FormId już istnieje; alternatywnie, "xmlDoc.DocumentElement.SetAttribute (" FormId "," nowaWartość ");" doda identyfikator FormId, jeśli jeszcze nie istnieje, lub zmień go, jeśli tak się stanie. – Polyfun

+0

Yup, jest to bardzo prosty przykład, ale można go zmienić dla własnych celów. – Davio

4

Aby wybrać odpowiedni wykorzystania węzła następujące XPath //Node[@Attribute='value'].

W twoim przypadku brakujący kawałek kodu może wyglądać tak:

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

See XPath reference lub sprawdzić ten tutorial.

+0

+1 za pokazanie, jak wyszukać identyfikator FormId pasujący do określonego Guida. – 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

najlepszym sposobem jest stworzenie funkcji, które mogą być ponownie wykorzystane w dowolnym miejscu:

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); 
    } 
Powiązane problemy