23

以下にXMLドキュメントがあり、このタグの横にFormId ="d617a5e8-b49b-4640-9734-bc7a2bf05691"<FormData>という属性として呼び出されるタグがあります。

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

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

Beは私の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>
4

6 に答える 6

30

これを行うには、次のようないくつかの方法があります。

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に関する優れたチュートリアルがあります。SetAttributeを使用すると、FormId属性がまだ存在しない場合は作成され、存在する場合は更新されます。

この場合、FormDataはたまたまドキュメントのルート要素であるため、次のことも実行できます。

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

この最後の例は、変更するノードがドキュメントのルート要素である場合にのみ機能します。

特定のFormIdGUIDに一致させるには(これが目的であるかどうかは明確ではありません):

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

この最後の例のselectは、FormId属性ではなくFormData要素を返すことに注意してください。[]括弧内の式を使用すると、特定の一致する属性を持つノードを検索できます。

于 2012-10-26T08:06:11.180 に答える
5

適切なノードを選択するには、次の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リファレンスを参照するか、このチュートリアルを確認してください。

于 2012-10-26T08:09:27.653 に答える
1

または、明示的にツリーを歩くことができます。

xmlDoc.DocumentElement.GetAttribute("FormId").Value = "";
于 2012-10-26T08:08:43.353 に答える
1

SetAttributeメソッドhttp://msdn.microsoft.com/en-us/library/system.xml.xmlelement.setattribute.aspxを使用できます

于 2012-10-26T08:11:48.480 に答える
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);
于 2013-10-25T11:14:35.787 に答える
1

最善の方法は、好きな場所で再利用できる関数を作成することです。

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);
    }
于 2015-08-25T12:51:47.267 に答える