2012-02-01 93 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(); 
    } 

雖然我,爲什麼你會想這樣做有點好奇......