Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > как обойти все узлы XML вместе в вложениями


Автор: San4o_Pan4o 22.9.2009, 17:49
В общем проблема такая: есть xml, получаемый с сервака, нужно в нем переименовать некоторые атрибуты (чтобы стали без префиксов). Юзаю проcто цикл foreach, но так он во внутрь не заходит, он только проверяет некоторый <tag1>...</tag1>, а то что внутри еще миллион тагов ему пофиг. Как сделать, чтобы было не пофиг?)
вот мой код:
Код

XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(xmlresp);
string namespase = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
foreach (XmlElement xel in xdoc.DocumentElement.ChildNodes[1])
{
  if (xel.NodeType != XmlNodeType.Element) continue;
  if (xel.HasAttribute("about", namespase))
  {
    string id = xel.GetAttribute("about", namespase);
    xel.RemoveAttribute("about", namespase);
    XmlAttribute new_attr = xdoc.CreateAttribute("id");
    xel.Attributes.Append(new_attr);
    xel.SetAttribute("id", id);
  }
}


и пример прилетающего xml:
Код

<?xml version='1.0' encoding='utf-8'?>
<dataresponse rdf:dummy="" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <request>
    <param name="c">GetItem</param>
    <param name="id">mag_090911114613_1003</param>
  </request>
  <data>
    <person rdf:about="mag_090911114613_1003">
      <name xml:lang="ru">Марчук Александр Гурьевич</name>
      <reflected inverse-resource="mag_090911114613_1004">
        <reflection rdf:about="mag_090911114613_1004">
          <in-doc rdf:resource="source_test_cassettepds08b2333cbda02eeb36fabb3cf3bd2cc4">
            <photo-doc rdf:about="source_test_cassettepds08b2333cbda02eeb36fabb3cf3bd2cc4">
              <name xml:lang="ru">source_test_cassette 0001 0003</name>
              <published>iiss://[email protected]/0001/0001/0003</published>
              <comment xml:lang="ru">F:\archive\IIS-history-archive\mixture\CC280.jpg</comment>
            </photo-doc>
          </in-doc>
        </reflection>
      </reflected>
      <reflected inverse-resource="mag_090911114613_1014">
        <reflection rdf:about="mag_090911114613_1014">
          <in-doc rdf:resource="source_test_cassettepdsd27d173a8f095177540e53ce8faf33bd">
            <photo-doc rdf:about="source_test_cassettepdsd27d173a8f095177540e53ce8faf33bd">
              <name xml:lang="ru">source_test_cassette 0001 0010</name>
              <published>iiss://[email protected]/0001/0001/0010</published>
              <comment xml:lang="ru">F:\archive\IIS-history-archive\mixture\gp_tn_dscn3064.jpg</comment>
            </photo-doc>
          </in-doc>
        </reflection>
      </reflected>
    </person>
  </data>
</dataresponse>


Автор: Rohoss 22.9.2009, 18:52
San4o_Pan4o, пиши рекурсивный метод 

Автор: diadiavova 22.9.2009, 20:26
Воспользуйся волшебным методом SelectNodes.

Автор: San4o_Pan4o 23.9.2009, 06:12
что же волшебного  в SelectNodes, если я априори не знаю какие там узлы? А насчет рекурсии уже думал, просто вдруг есть более красивый метод))

Автор: diadiavova 23.9.2009, 08:56
Код

xdoc.DocumentElement.SelectNodes(".//*");

 smile 

Автор: San4o_Pan4o 23.9.2009, 09:16
diadiavova, спасибо большое! Блин, так затупить... smile  Выручил просто! smile 

Автор: diadiavova 23.9.2009, 09:27
 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)