2012-10-26 23 views
19

は、私は以下のXML文書を持っており、属性が =「d617a5e8-b49b-4640から9734-bc7a2bf05691を」フォームIDと呼ばれるそれとしてこのタグ側で<FormData>と呼ばれるタグがありXML文書の属性の値を変更するにはどうすればよいですか?

私はその値を変更したいですC#コードで?

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

て私の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> 

答えて

23

含めこれにはいくつかの方法、あります

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

それとも、これは:

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

selectSingleNodeメソッドXPathを使用してノード; XPath hereに関する良いチュートリアルがあります。 SetAttributeを使用すると、FormId属性が存在しない場合は作成され、存在する場合は更新されます。

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

あなたが変更しているノードがのルート要素であることを起こるところこの最後の例では、のみ動作します。この場合

、いるFormDataはあなたにもこれを行うことができますので、ドキュメントのルート要素であることを起こりますドキュメント。特定のフォームIDのGUIDを一致させるために

(これはあなたが望んでいるならば、それは明らかではありません):この最後の例では選択がいるFormData要素ではなくフォームID属性を返すこと

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

注意。 []内の式は、特定の一致する属性を持つノードを検索することができます。

+1

+1を、たくさんの情報がにありますGoogleはXPathで動作し、通常は各ノードをトラバースしようとするよりも優れています。 –

+0

ありがとう偉大な答え+1 – Pomster

1

それとも、明示的にツリーを歩くことができます:

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

+1。これは、FormId属性が既に存在することを前提としています。代わりに、 "xmlDoc.DocumentElement.SetAttribute(" FormId "、" newValue ");"既に存在しない場合はFormIdを追加し、FormIdが存在する場合はFormIdを変更します。 – Polyfun

+0

これは非常に簡単な例ですが、あなた自身の目的のために変更することができます。 – Davio

4

をXPathの//Node[@Attribute='value']次右ノードの使用を選択します。

あなたのケースでは、コードの欠落している部分は、次のようになります。

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

参照するXPath referenceまたはこのtutorialを確認してください。

+0

+1特定のGUIDに一致するFormIdを検索する方法を示します。 – 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

を使用することができます。XPathを推奨する

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); 
    } 
関連する問題