Проблема с редактированием xml файла
Имеется проблема при работе с XML файлом. В нём присутствует вёрстка. В коде не хочет входить в цикл для редактирования значения элементов. Вот пример.
XDocument xdoc = XDocument.Load("arrived.xml");
foreach (XElement xe in xdoc.Root.Elements("body2").ToList())
{
}
А вот XML
<!--?xml version="1.0" encoding="UTF-8"?-->
<htmlx xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<body2> </body2>
</htmlx>
Причём, если вместо xmlns в Root указать, допустим, xmlns1, то в цикл входит и работает без проблем, но тогда слетает вёрстка. Как вариант в шаблоне XML изначально указывать xmlns1,а при сохранении переименовывать параметр, но это костыли.
Ответы (2 шт):
Причина тривиальна: в стандарте нет body2 поэтому когда вы указываете стандарт w3c через xmlns - то элемента нет. Когда убираете использовать стандарт убирая xmlns (а переименовывая вы его убираете из документа) вы получаете нестандартный элемент.
А чего вы хотели? Вы работаете якобы по стандарту, но у вас body2 -- и поэтому о каких костылях может идти речь? Хотите стандарт - соблюдайте стандарт, не будет костылей. Если "xml не мой", обратитесь к автору и бейте по рукам, но уговаривайте использовать стандартную схему (и тогда вы сможете использовать валидацию по xsd и обосновывать отказ в обработке файла), либо ставьте костыли разного рода.
Вы не можете использовать xmlns1. Это атрибут. Пространство имен по умолчанию всегда xmlns.
Ваш XML имеет пространство имен по умолчанию (default namespace). Ниже вы узнаете, как правильно с ним работать.
Все элементы XML ниже корневого узла принадлежат пространству имен по умолчанию. Даже если вы не видите его в XML.
c#
void Main()
{
const string fileName = @"e:\Temp\Anton.xml";
XDocument xdoc = XDocument.Load(fileName);
// получить пространство имен по умолчанию
XNamespace ns = xdoc.Root.GetDefaultNamespace();
foreach (XElement xe in xdoc.Root.Elements(ns + "body2"))
{
Console.WriteLine(xe.Value);
}
}