Конференция ".Net" » изменить имя тэга [C#]
 
  • alex_*** © (28.11.05 14:36) [0]
    есть XmlDocument. Можно ли переименовать элемент, root например. Я что-то не нашел методов для переименования. Единственный способ это создать новый документ?
  • k2 © (29.11.05 06:25) [1]
    если не секрет для чего это нужно?
  • alex_*** © (29.11.05 12:38) [2]
    преобразовать один тип документа в другой
  • k2 © (29.11.05 13:00) [3]
    што значит тип документа (на примере)?
    я не изгаляюсь, если нужно расскажи подробнее
    методов для переименования вроде не видно, преобразования удобно делать через xslt
  • alex_*** © (29.11.05 13:18) [4]
    <root>
    <Doc ID="1" NAME="test" />
    </root_old>

    Надо:
    <new_root>
    <Doc ID="1" NAME="test">
    </new_root>
  • Alkid © (29.11.05 16:38) [5]

    > <root>
    > <Doc ID="1" NAME="test" />
    > </root_old>
    >
    > Надо:
    > <new_root>
    > <Doc ID="1" NAME="test">
    > </new_root>

     Это, конечно, изврат, но можно XSLT преобразование на этот счёт забабахать. :) Но это изврат. Вообще отсутствие явного метода для установки имени элемента меня самого смущает
  • ИА (29.11.05 17:10) [6]
    Имя вместе с namespace согласно W3C readonly. MS напрягаться не стал что в общем понятно. Хотя есть библиотеки которые напряглись.

    Обычно делается что-то вроде

    targetDoc.AppendChild(targetDoc.CreateElement("new_root"));
    targetDoc.DocumentElement.InnerXml = sourceDoc.DocumentElement.InnerXml;



    Если есть атрибуты их по цциклу скопировать тривиально.
  • Alkid © (29.11.05 17:36) [7]

    > Имя вместе с namespace согласно W3C readonly. MS напрягаться
    > не стал что в общем понятно. Хотя есть библиотеки которые
    > напряглись.
    >
    > Обычно делается что-то вроде
    >
    > targetDoc.AppendChild(targetDoc.CreateElement("new_root"));
    >
    > targetDoc.DocumentElement.InnerXml = sourceDoc.DocumentElement.
    > InnerXml;
    >
    >
    > Если есть атрибуты их по цциклу скопировать тривиально.

    Тоже не сахар - перепарсить весь документ для изменения наименования одного элемента. :-) XSLT хотя бы генерит DOM-дерево из DOM-дерева.
  • alex_*** © (29.11.05 17:37) [8]
    если структура документа не задана, что-то неохота в рекурсию влезать. InnerXml тащит namespace по нодам, чего не хотелось бы. Кто пользовал XslTransform, может подскажете как через него это сделать и еще оригинальный Namespace убить до кучи. Попробовал XmlNamespaceManager пользовать, не получается пока.
  • alex_*** © (29.11.05 17:53) [9]
    Namespace поставил пустым, OPENXML кушает его вроде и то хорошо...
  • Alkid © (29.11.05 17:55) [10]

    > если структура документа не задана, что-то неохота в рекурсию
    > влезать. InnerXml тащит namespace по нодам, чего не хотелось
    > бы. Кто пользовал XslTransform, может подскажете как через
    > него это сделать и еще оригинальный Namespace убить до кучи.
    >  Попробовал XmlNamespaceManager пользовать, не получается
    > пока.

    Значит так, я приврал XslTransform на выходе даёт не XmlDocument, а текст
    XML. Над XSLT запросом надо помозговать, я это только-только начал изучать и тонкостей не знаю.
  • ИА (29.11.05 20:00) [11]

    > Тоже не сахар - перепарсить весь документ для изменения
    > наименования одного элемента. :-) XSLT хотя бы генерит DOM-
    > дерево из DOM-дерева.


    Нет, максимум можно в XmlWriter/Reader. Объектной модели не получить
  • ИА (29.11.05 20:42) [12]

    > InnerXml тащит namespace по нодам, чего не хотелось бы

    Про namespace в оригинальном письме не было :)
    В этом случае я бы попробовал комбинацию из XmlReader и XmlWriter.
    Сложнее, но универсально.
  • k2 © (30.11.05 04:08) [13]
    to ИА   (29.11.05 20:42) [12]
    про namespace наверное из баз тянется :) http://pda.delphimaster.net/?id=1133265336&n=1


    example.xml:
    <?xml version="1.0" encoding="utf-8" ?>
    <root>
    <Doc ID="1" NAME="test" />
    <Doc ID="2" NAME="test1" />
    </root>

    example.xsl:
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="root">
    <xsl:element name="root1">
    <xsl:apply-templates/>
    </xsl:element>
    </xsl:template>
    <xsl:template match="/|@*|node()">
       <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
       </xsl:copy>
    </xsl:template>
    </xsl:stylesheet>



    можно наверное и ещё извратнее, но давно шашек в руки не брала :)
    в любом случае пока непонятно зачем отталкиваться от названия элемента, если проще по-моему расширить список аттрибутов
  • ИА (30.11.05 07:26) [14]

    > можно наверное и ещё извратнее, но давно шашек в руки не
    > брала :)


    Не люблю xslt, xpath и прочие игры с некомпилируемым кодом - практически невозможно определить, не выдается ли результат ввиду его принципиального отсутствия или ошибки в выражениях. Особенно весело когда в документе элементы с различными namespace. Собственно, я давно уже очень редко работаю с XML - надежнее создать объектную модель для элементов и туда его грузить, работать а потом выгружать.

    Возращаясь к первоначальному вопросу - если присутствуют namespace как я уже говорил надо комбинировать xml reader/ writer.
     Скелет кода выглядит примерно так:


    XmlNodeReader nodeReader = new XmlNodeReader(sourceDocument);
    XmlTextWriter nodeWriter = new XmlTextWriter(Console.Out);
    nodeWriter.WriteStartElement(newRootElement);
    while (nodeReader.Read())
    {
     if (nodeReader.Depth == 0)
     {
        nodeWriter.WriteAttributes(nodeReader, false);
     }

     else
     {
        nodeWriter.WriteNode(nodeReader, false);
    }

    }
    nodeWriter.WriteEndElement();

  • k2 © (30.11.05 07:33) [15]
    поддерживаю предыдущего оратора :о) изврат был показан чисто в тренировочных целях
 
Конференция ".Net" » изменить имя тэга [C#]
Есть новые Нет новых   [134430   +1][b:0][p:0.002]