none
Как скопировать элементы из xml не потеряв актуального значения xml:lang? RRS feed

  • Вопрос

  • Привет народ

    Есть xml:

    <e1 xml:lang='en-us'><e2>Hello</e2></e1>

    Есть второй xml:

    <t1></t1>

    Нужно используя .NET скопировать e2 в t1 так, чтобы e2 не потерял информацию о языке:

    <t1><e2 xml:lang='en-us'>Hello</e2></t1>

    Дело в том, что согласно стандарту XML 2.12 Language Identification значение xml:lang распространяется на подэлементы и по идеи при копировании оно должно сохраняться.
    Хотелось бы узнать какое-нибудь готовое решение, которое есть в стандартных библиотека .NET, чтобы скопировать элемент без потери значения xml:lang.

    29 октября 2013 г. 12:44

Ответы

  • Полистав msdn, немало погуглив (видел вашу тему на хэшкоде), пришёл к неутешительному выводу: стандартный Linq2Xml некорректно копирует элементы с родительскими xml:lang.

    Как вы уже сами знаете, через XPathNavigator можно получать это значение. Но это ручная работа.

    Так что, придётся только самостоятельно писать дополнительный код.

    30 октября 2013 г. 13:23

Все ответы

  • М-м-м... И в чём проблема?

    Вставляем первый xml во второй. Атрибут lang сохранится.

    Например:

    string str1 = "<e1 xml:lang='en-us'><e2>Hello</e2></e1>";
    string str2 = "<t1></t1>";
    
    XElement xml1 = XElement.Parse(str1);
    XElement xml2 = XElement.Parse(str2);
    
    xml2.Add(xml1);

    29 октября 2013 г. 13:33
  • добавьте в ваш пример

    Console.WriteLine(xml2.ToString());

    и вы увидите:

    <t1><e1 xml:lang="en-us"><e2>Hello</e2></e1></t1>

    а мне нужно:

    <t1><e2 xml:lang="en-us">Hello</e2></t1>



    • Изменено Leonid Maliutin 29 октября 2013 г. 13:56 форматирование
    29 октября 2013 г. 13:55
  • Да, я был невнимателен.

    Понял суть проблемы. Действительно, xml:lang не копируется с дочерними узлами.

    Конечно, вручную можно добавить любой атрибут. Но хотелось бы, чтобы это делалось само. Подумаю, что можно сделать, поштудирую документацию.

    29 октября 2013 г. 15:05
  • Полистав msdn, немало погуглив (видел вашу тему на хэшкоде), пришёл к неутешительному выводу: стандартный Linq2Xml некорректно копирует элементы с родительскими xml:lang.

    Как вы уже сами знаете, через XPathNavigator можно получать это значение. Но это ручная работа.

    Так что, придётся только самостоятельно писать дополнительный код.

    30 октября 2013 г. 13:23