Как изменить значение атрибута в документе XML?
У меня есть документ XML ниже, и есть тег под названием <FormData>
в стороне этого тега как атрибут FormId= "d617a5e8-b49b-4640-9734-bc7a2bf05691"
Я хотел бы изменить это значение в коде С#?
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>
Ответы
Ответ 1
Существует несколько способов сделать это, включая:
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 для поиска node; есть хороший учебник о XPath здесь. Использование SetAttribute означает, что атрибут FormId будет создан, если он еще не существует, или обновлен, если он уже существует.
В этом случае FormData является корневым элементом документа, поэтому вы также можете сделать это:
xmlDoc.DocumentElement.SetAttribute("FormId", "newValue"); // Set to new value.
Этот последний пример будет работать только там, где node, который вы изменяете, является корневым элементом в документе.
Чтобы соответствовать определенному указателю FormId (неясно, как это вы хотели):
XmlElement formData = (XmlElement)xmlDoc.SelectSingleNode("//FormData[@FormId='d617a5e8-b49b-4640-9734-bc7a2bf05691']");
if (formData != null)
{
formData.SetAttribute("FormId", "newValue"); // Set to new value.
}
Обратите внимание, что выбор в этом последнем примере возвращает элемент FormData, а не атрибут FormId; выражение в скобках [] позволяет нам искать node с определенным атрибутом соответствия.
Ответ 2
Чтобы выбрать правильный node, используйте следующий 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 ссылка или проверьте этот учебник.
Ответ 3
Или вы можете явно пропустить дерево:
xmlDoc.DocumentElement.GetAttribute("FormId").Value = "";
Ответ 4
Вы можете использовать метод SetAttribute http://msdn.microsoft.com/en-us/library/system.xml.xmlelement.setattribute.aspx
Ответ 5
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);
Ответ 6
лучший способ - создать функцию, которую можно использовать в любом месте:
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);
}