2016-07-14 272 views
0

我需要使用c#刪除特定的xml標籤,但問題是,該標籤可能位於不同的父標籤中。獲取C#中特定節點/標籤的父節點/標籤#

因此,我需要搜索該特定標籤並獲取其父標籤,然後將其刪除。

這是我的xml文件

<PublisherInfo> 
    <PublisherName value="1">Askquestionzero Publisher</PublisherName> 
    <PublisherLocation>Ph</PublisherLocation> 
    <PublisherImprintName>Askquestionzero</PublisherImprintName> 
    <PublisherLogo> 
     <Tada>Remove this value and its content</Tada> 
    </PublisherLogo> 
    <PublisherURL>Askquestionzero.com</PublisherURL> 
</PublisherInfo> 

,這是我的代碼

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.Load(@"C:\Users\user\Desktop\askquestion.xml"); 
XmlNode nodeToDelete = xmlDoc.SelectSingleNode("/PublisherInfo/PublisherLogo/Tada"); 
if (nodeToDelete != null) 
{ 
    nodeToDelete.ParentNode.RemoveChild(nodeToDelete); 
} 
Console.WriteLine(xmlDoc.OuterXml); 

代碼的作品,但我需要指定它的父標籤。那麼如何循環訪問xml文件,並且如果找到Tada標記,則獲取其父標記,然後將其刪除。

預期輸出:

<PublisherInfo> 
    <PublisherName value="1">Askquestionzero Publisher</PublisherName> 
    <PublisherLocation>Ph</PublisherLocation> 
    <PublisherImprintName>Askquestionzero</PublisherImprintName> 
    <PublisherLogo> 
    </PublisherLogo> 
    <PublisherURL>Askquestionzero.com</PublisherURL> 
</PublisherInfo> 

另一個問題:

我也需要改變一個XML文件的節點。該文件與上述相同。

以下是更改xml節點/標記名稱的代碼。但它保持其屬性。我想要它改變它的標籤名稱並刪除它的屬性。

XmlDocument xmlDocument = new XmlDocument(); 
xmlDocument.Load(@"C:\Users\user\Desktop\askquestion.xml"); 
Console.WriteLine(xmlDocument.OuterXml); 
XmlElement element = (XmlElement)xmlDocument.GetElementsByTagName("PublisherName")[0]; 
XmlElement renamedElement = (XmlElement)RenameNode(element, null, "new-element"); 
Console.WriteLine(xmlDocument.OuterXml); 
public static XmlNode RenameNode(XmlNode node, string namespaceUri, string qualifiedName) 
{ 
    if (node.NodeType == XmlNodeType.Element) 
    { 
     XmlElement oldElement = (XmlElement)node; 
     XmlElement newElement = node.OwnerDocument.CreateElement(qualifiedName, namespaceUri); 
     while (oldElement.HasAttributes) 
     { 
     newElement.SetAttributeNode(oldElement.RemoveAttributeNode(oldElement.Attributes[0])); 
     } 
     while (oldElement.HasChildNodes) 
     { 
      newElement.AppendChild(oldElement.FirstChild); 
     } 
     if (oldElement.ParentNode != null) 
     { 
      oldElement.ParentNode.ReplaceChild(newElement, oldElement); 
     } 
     return newElement; 
    } 
    else 
    { 
     return null; 
    } 
} 

以上代碼的輸出:

<new-element value="1">Askquestionzero Publisher</new-element> 

所需的輸出:

<new-element>Askquestionzero Publisher</new-element> 
+0

你只是想刪除'Tada'元素或者包括父元素?這將有助於如果你包括你的預期輸出。 –

+0

問題已更新。謝謝 – askquestionzero

回答

1

我喜歡用XDocument,使用LinqXml你可以只找到元素,並調用Remove爲所示。

XDocument doc = XDocument.Load(filepath); 

    doc.Descendants("Tada") 
     .First() 
     .Remove(); 

關於其他問題,如果你想刪除屬性,你可以使用相同的邏輯(像這樣)。

doc.Descendants("new-element") 
     .Select(e=>e.Attribute("value")) 
     .Remove(); 

既然你想改變TagName,我更喜歡加入新的元素和刪除現有的元素(如在評論中提到的)。下面的代碼將刪除具有value作爲其中一個屬性的PublisherName元素。

var elements=doc.Descendants("PublisherName") 
     .Where(e=>e.Attribute("value") != null); 

    foreach(var element in elements) 
    { 
     element.Parent.Add(new XElement("new-element", (string)element.Value)); 
    } 

入住這Demo

+0

你可以給我更改元素名稱的代碼爲新的嗎?謝謝。沒有得到它的屬性。並將該屬性留空?謝謝。我想我需要學習linq – askquestionzero

+0

我不喜歡改變元素名稱,而是我會添加新元素並刪除現有元素。 –

+0

我該怎麼做先生?你可以給我一個例子嗎?如何刪除元素名稱並添加新元素。在元素的位置被刪除?謝謝。在我解決這個問題之後,病號標記爲檢查問題。謝謝 – askquestionzero