2012-02-01 94 views
1

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

我怎样才能删除不删除<test>节点<application>节点?

+1

等待悬念想要删除的东西...;) – Bertie 2012-02-01 09:11:30

+0

:P 123去.... – Pascal 2012-02-01 09:16:13

+0

大声笑我假设它的“测试”标签,你不想删除。我认为你必须把它们作为代码 - 在一个有四个空格缩进的新行上,否则它们会被剥离。 – Bertie 2012-02-01 09:24:07

回答

1

OK,所以可能不是我最好的答案,但希望可以在本适合您的需求,或者给你一个好的起点。首先,我假设你正在使用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#

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

+0

ok你只需要捕捉“内部”节点并把它放到一个新的xml文档中,那么......至少它应该可以工作;-) – Pascal 2012-02-01 10:41:15

+0

这就是它 - 基本上是 - 是的!:)不像删除外层节点那样聪明。烦我,因为我相信有更好的办法!!但是这应该服务你的目的希望! – Bertie 2012-02-01 11:00:55

+0

好吧,我是务实的:) – Pascal 2012-02-06 16:31:00

0

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

不错,虽然,OP包含了Linq-to-XML标签,我在上面包含了一个更加粗糙的解决方案 – 2012-02-01 10:22:24

0

那么有这一点;

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

虽然我,为什么你会想这样做有点好奇......