2013-03-29 1 views
1

Потребовалось некоторое время, но я, наконец, смог изменить документ 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> 

ответ

2

Если вы хотите просто выбрать первый узел DefinitionName.

Вы можете написать

XmlNode node = rootElement[nodeName, namespace]; 

, и если вы хотите, чтобы весь список:

XmlNodeList nodeList = rootElement.GetElementsByTagName(nodeName, namespace); 
+0

+1 Простой, чистый и элегантный. Спасибо. –

1

Что об использовании XPath local-name() и namespace-uri() функции?

string xpath = string.Format("//*[local-name()='{0}' and namespace-uri()='{1}']", nodeName, namespace); 
xmlNodes = rootElement.SelectNodes(xpath); 

Не знаю, если эти функции поддерживаются в XmlDocument, хотя, не проверял.

+0

+1 Это сработало. Спасибо. –

Смежные вопросы