【问题标题】:Delete outer xml node without deleting inner xml删除外部 xml 节点而不删除内部 xml
【发布时间】:2012-02-01 09:10:06
【问题描述】:

这是我的 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>

如何在不删除&lt;test&gt; 节点的情况下删除&lt;application&gt; 节点?

【问题讨论】:

  • 悬念中等待您要删除的内容... ;)
  • 大声笑我假设它是您不想删除的“测试”标签。我认为您必须将它们作为代码放在一个带有四个空格缩进的新行上,否则它们会被剥离。
  • (请注意,无论何时您想使用&lt;,它必须采用代码格式:使用{} 图标,或用反引号括起来,或缩进四个字符)
  • @JacobusR 没有一个愚蠢的学生做过:String.Append("

标签: c# linq linq-to-xml xmlnode


【解决方案1】:

好的,所以可能不是我的最佳答案,但希望这能满足您的需求,或者为您提供一个良好的起点。首先,我假设您使用的是 C#。因此,我这样做的方式是使用要删除的节点并选择其子节点并使用它们来创建新的 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 帖子作为我的指南:How to delete node from XML file using C#

编码愉快,
干杯,
克里斯。

【讨论】:

  • 好的,您只需获取“内部”节点并将其放入新的 xml 文档中。好吧...好吧,至少它应该可以工作;-)
  • 基本上就是这样 - 是的! :) 不像删除外部节点那么聪明。烦我,因为我确信有更好的方法!但这应该有望满足您的目的!
【解决方案2】:

使用 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>

【讨论】:

  • 不错。虽然,OP 包含了 Linq-to-XML 标记。我在上面提供了一个更粗略的解决方案。
【解决方案3】:

是这样的;

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();
    }

虽然我有点好奇你为什么要这样做......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 2011-02-09
    相关资源
    最近更新 更多