Потребовалось некоторое время, но я, наконец, смог изменить документ XML на основе пользовательского ввода для пространства имен и имя узла:Изменение узла XML с предоставленной пользователем пространства имен и значение узла
string nodeName = "DefinitionName"; // this is really provided by the user
string namespace = "http://schemas.datacontract.org/2004/07/Xxx.Session"; // also user-provided
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(taskResolved.XmlPathAndFileName);
XmlElement rootElement = xmlDocument.DocumentElement;
XmlNamespaceManager namespaceManager = new XmlNamespaceManager(xmlDocument.NameTable);
namespaceManager.AddNamespace("snuh", namespace); // hard-coded prefix, grrr...
XmlNodeList xmlNodes;
xmlNodes = rootElement.SelectNodes("//snuh:" + nodeName, namespaceManager);
Я чувствую, что делаю что-то не так, потому что мне нужно жестко закодировать префикс (snuh). Я мог бы попытаться выбрать префикс, например snuh, который, я надеюсь, никогда не появится в документе, но это не является надежным. Другой вариант - использовать GUID для префикса, но это просто похоже на работу с хаком. Я что-то упускаю? Есть ли способ лучше?
В верхней части XML-документ выглядит следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<SessionStateInfo xmlns:i="http://www.w3.org/2001/XMLSchema-instance" z:Id="1"
z:Type="Xxx.SessionStateInfo"
z:Assembly="Xxx.Common, Version=6.2.0.0, Culture=neutral, PublicKeyToken=null"
xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"
xmlns="http://schemas.datacontract.org/2004/07/Xxx.Session">
<CoaterNumber>25</CoaterNumber>
<DefinitionName z:Id="2">TwoLineMarkerDefinition</DefinitionName>
<EnableManualMode>true</EnableManualMode>
+1 Простой, чистый и элегантный. Спасибо. –