2012-10-26 12 views
19

aşağıda bir XML belgesi varsa ve bir öznitelik = "d617a5e8-b49b-4640-9734-bc7a2bf05691" formID denilen o kadar bu etiket tarafında <FormData> adlı etikete varXML belgesindeki bir özelliğin değeri nasıl değiştirilir?

ben bu değeri değiştirmek istiyorum C# kodunda?

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

Be my XML belgesidir:

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

cevap

23

dahil Bunu yapmanın birkaç yolu vardır:

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

Ya da bu:

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

SelectSingleNode yöntemi bulmak için XPath kullanır düğüm; XPath here hakkında iyi bir öğretici var. SetAttribute kullanmak, FormId özniteliği zaten mevcut değilse veya zaten mevcutsa güncellenir demektir. Bu durumda

, FormData belgenin kök öğesi olur, bu yüzden de bunu yapabilirsiniz: Eğer değişiyor düğüm kök elemanı olur nerede

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

Bu son örnek, yalnızca çalışır edecek döküman. (Istediğinin bu ise belli değil)

belirli formID guıd eşleştirmek için: Bu son örnekte seçkin FormData elemanı olup formID niteliğini döndüren

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

Not; [] parantezindeki ifade, belirli bir eşleme özelliğine sahip bir düğümü aramamıza olanak tanır.

+1

+1, bol miktarda bilgi için orada Google'da XPaths ve genellikle her bir düğümü çaprazlamaya çalışmaktan daha iyidir. –

+0

Teşekkürler harika bir cevap +1 – Pomster

1

Yoksa açıkça ağacı yürüyebiliyordu:

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

+1. Not Bu, FormId özniteliğinin zaten var olduğunu varsayar; alternatif olarak, "xmlDoc.DocumentElement.SetAttribute (" FormId "," newValue ");" FormId zaten var değilse ekleyin veya varsa değiştirin. – Polyfun

+0

Yup, bu çok basit bir örnek, ancak kendi amacınıza göre değiştirebilirsiniz. Belirli bir kılavuzla eşleşen bir FormId aramayı göstermek için – Davio

4

XPath //Node[@Attribute='value'] aşağıdaki doğru düğüm kullanımını seçin. Senin durumunda

kod eksik parçası gibi görünebilir:

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

Bkz XPath reference veya bu tutorial işaretleyin.

+0

+1. – 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

iyi yolu olduğunu kullanabilirsiniz: XPath'leri tavsiye için

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); 
    } 
İlgili konular