Удалить внешний узел xml без удаления внутреннего xml

Это мой xml:

<application name="Test Tables">
<test>
  <xs:schema id="test" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">   
  </xs:schema> 
</test>
</application>

Как я могу удалить узел <application>, не удаляя узел <test>?


person Pascal    schedule 01.02.2012    source источник
comment
В ожидании того, что вы хотите удалить... ;)   -  person Bertie    schedule 01.02.2012
comment
Лол Ам, предполагая, что это тестовый тег, который вы не хотите удалять. я думаю, вы должны поместить их как код - на новой строке с отступом в четыре пробела, иначе они будут удалены.   -  person Bertie    schedule 01.02.2012
comment
(обратите внимание, что всякий раз, когда вы хотите использовать <, он должен быть отформатирован кодом: используйте значок {}, заключайте его в обратные кавычки или отступайте на четыре символа)   -  person AakashM    schedule 01.02.2012
comment
@JacobusR Нет, глупый студент сделал: String.Append(‹application...)... :P   -  person Pascal    schedule 01.02.2012


Ответы (3)


Хорошо, так что, вероятно, это не лучший мой ответ, но я надеюсь, что это соответствует вашим потребностям или дает вам хорошую отправную точку. Во-первых, я предполагаю, что вы используете С#. Итак, как я это сделал, я использовал узел, который вы хотите удалить, и выбрал его дочерние узлы и использовал их для создания нового XDocument. Для этого мог бы быть более изящный способ использовать Linq, но будь я проклят, если я это увижу! В любом случае, надеюсь, это поможет:

var doc = XDocument.Load(@".\Test1.xml");

var q = (from node in doc.Descendants("application")
        let attr = node.Attribute("name")
        where attr != null && attr.Value == "Test Tables"
        select node.DescendantNodes()).Single();

var doc2 =  XDocument.Parse(q.First().ToString());

Я использовал этот пост SO в качестве руководства: Как удалить node из XML-файла с использованием C#

Удачного программирования,
С уважением,
Крис.

person Bertie    schedule 01.02.2012
comment
хорошо, вы просто выбираете внутренний узел и помещаете его в новый XML-документ. Ну... хорошо, по крайней мере, это должно работать ;-) - person Pascal; 01.02.2012
comment
Вот в принципе - да! :) Не так умно, как удаление внешнего узла. Раздражает меня, потому что я уверен, что есть лучший способ!! Но, надеюсь, это должно служить вашим целям! - person Bertie; 01.02.2012

Используя XSLT, вы можете сделать это:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="application">
    <xsl:apply-templates select="test"/>
  </xsl:template>

  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
person Jack    schedule 01.02.2012
comment
Хороший. Хотя тег Linq-to-XML был включен в OP. Я включил довольно грубое решение выше. - person Mel Padden; 01.02.2012

Ну вот это;

static void Main(string[] args)
    {
        string doc = @"
                    <application name=""Test Tables"">
                    <test>
                      <xs:schema id=""test"" xmlns="""" xmlns:xs=""http://www.w3.org/2001/XMLSchema""                         xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"">   
                      </xs:schema> 
                    </test>
                    </application>
                    ";
        XDocument xDoc = XDocument.Parse(doc);
        Console.Write(xDoc.ToString());
        Console.ReadLine();

        string descendants = xDoc.Descendants("application").DescendantNodes().First().ToString();
        xDoc = XDocument.Parse(descendants);
        Console.Write(xDoc.ToString());
        Console.ReadLine();
    }

Хотя мне немного любопытно, почему вы хотите это сделать...

person Mel Padden    schedule 01.02.2012