-
есть XmlDocument. Можно ли переименовать элемент, root например. Я что-то не нашел методов для переименования. Единственный способ это создать новый документ?
-
если не секрет для чего это нужно?
-
преобразовать один тип документа в другой
-
што значит тип документа (на примере)? я не изгаляюсь, если нужно расскажи подробнее методов для переименования вроде не видно, преобразования удобно делать через xslt
-
<root> <Doc ID="1" NAME="test" /> </root_old>
Надо: <new_root> <Doc ID="1" NAME="test"> </new_root>
-
> <root> > <Doc ID="1" NAME="test" /> > </root_old> > > Надо: > <new_root> > <Doc ID="1" NAME="test"> > </new_root>
Это, конечно, изврат, но можно XSLT преобразование на этот счёт забабахать. :) Но это изврат. Вообще отсутствие явного метода для установки имени элемента меня самого смущает
-
Имя вместе с namespace согласно W3C readonly. MS напрягаться не стал что в общем понятно. Хотя есть библиотеки которые напряглись. Обычно делается что-то вроде
targetDoc.AppendChild(targetDoc.CreateElement("new_root"));
targetDoc.DocumentElement.InnerXml = sourceDoc.DocumentElement.InnerXml;
Если есть атрибуты их по цциклу скопировать тривиально.
-
> Имя вместе с namespace согласно W3C readonly. MS напрягаться > не стал что в общем понятно. Хотя есть библиотеки которые > напряглись. > > Обычно делается что-то вроде > > targetDoc.AppendChild(targetDoc.CreateElement("new_root")); > > targetDoc.DocumentElement.InnerXml = sourceDoc.DocumentElement. > InnerXml; > > > Если есть атрибуты их по цциклу скопировать тривиально.
Тоже не сахар - перепарсить весь документ для изменения наименования одного элемента. :-) XSLT хотя бы генерит DOM-дерево из DOM-дерева.
-
если структура документа не задана, что-то неохота в рекурсию влезать. InnerXml тащит namespace по нодам, чего не хотелось бы. Кто пользовал XslTransform, может подскажете как через него это сделать и еще оригинальный Namespace убить до кучи. Попробовал XmlNamespaceManager пользовать, не получается пока.
-
Namespace поставил пустым, OPENXML кушает его вроде и то хорошо...
-
> если структура документа не задана, что-то неохота в рекурсию > влезать. InnerXml тащит namespace по нодам, чего не хотелось > бы. Кто пользовал XslTransform, может подскажете как через > него это сделать и еще оригинальный Namespace убить до кучи. > Попробовал XmlNamespaceManager пользовать, не получается > пока.
Значит так, я приврал XslTransform на выходе даёт не XmlDocument, а текст XML. Над XSLT запросом надо помозговать, я это только-только начал изучать и тонкостей не знаю.
-
> Тоже не сахар - перепарсить весь документ для изменения > наименования одного элемента. :-) XSLT хотя бы генерит DOM- > дерево из DOM-дерева.
Нет, максимум можно в XmlWriter/Reader. Объектной модели не получить
-
> InnerXml тащит namespace по нодам, чего не хотелось бы
Про namespace в оригинальном письме не было :) В этом случае я бы попробовал комбинацию из XmlReader и XmlWriter. Сложнее, но универсально.
-
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: <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>
можно наверное и ещё извратнее, но давно шашек в руки не брала :) в любом случае пока непонятно зачем отталкиваться от названия элемента, если проще по-моему расширить список аттрибутов
-
> можно наверное и ещё извратнее, но давно шашек в руки не > брала :)
Не люблю 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())
else
}
nodeWriter.WriteEndElement();
-
поддерживаю предыдущего оратора :о) изврат был показан чисто в тренировочных целях
|