C # анализ XML с пространством имен - PullRequest
3 голосов
/ 22 июня 2011

У меня возникли проблемы с анализом XML-файла с пространством имен

XML-файл имеет такую ​​строку

<my:include href="include/myfile.xml"/>

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(file);
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);
nsmgr.AddNamespace("my", "http://www.w3.org/2001/xinclude");

XmlNodeList includeNodeList = xmlDoc.SelectNodes(@"/root/my:include", nsmgr);

Я привык делать что-то подобное, но я не читаю, как я думаю, что это должно быть ... node ["href"] равен нулю, и что бы я ни изменил, не могу получить

foreach (XmlNode node in includeNodeList)
{
  if (node["href"] != null)
  {                  
    // Save node["href"].Value here                    
  }
}

Если я остановлю его в отладчике, я увижу, что у узла есть информация, которую я хочу во внешнем тексте. ... я могу сохранить внешний текст и разобрать его таким образом, но я знаю, что должно быть что-то простое, что я пропускаю. Может кто-нибудь сказать мне, что мне нужно сделать, чтобы получить значение href, пожалуйста.

Ответы [ 2 ]

1 голос
/ 22 июня 2011

Другой подход заключается в выборе атрибутов href с использованием XPath:

var includeNodeList = xmlDoc.SelectNodes(@"/root/my:include/@href", nsmgr);
foreach(XmlNode node in includeNodeList)
    node.Value = "new value";
1 голос
/ 22 июня 2011

Индексатор класса XmlNode возвращает первый дочерний элемент с заданным именем, а не значение атрибута.

Вы ищете метод XmlElement.GetAttribute :

foreach (XmlElement element in includeNodeList.OfType<XmlElement>())
{
    if (!string.IsNullOrEmpty(element.GetAttribute("href")))
    {                  
        element.SetAttribute("href", "...");
    }
}

или Метод XmlElement.GetAttributeNode :

foreach (XmlElement element in includeNodeList.OfType<XmlElement>())
{
    XmlAttribute attr = element.GetAttributeNode("href");
    if (attr != null)
    {                  
        attr.Value = "...";
    }
}
...