2016-07-14 44 views
0

c#を使用して特定のxmlタグを削除する必要がありますが、そのタグは異なる親タグに配置される可能性があります。特定のノード/タグの親ノード/タグを取得する#

だから私はその特定のタグを検索し、親タグを取得してそれを削除する必要があります。

これは私の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

?期待される出力を含めると役立ちます。 –

+0

質問が更新されます。ありがとうございます – askquestionzero

答えて

1

私はあなただけの要素を検索し、としてRemoveを呼び出すことができますXmlLinqを使用して、XDocumentを使用して好みます表示されます。

XDocument doc = XDocument.Load(filepath); 

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

他の質問については、属性を削除する場合は、同じロジック(このようなもの)を使用できます。

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

あなたがTagNameを変更したいので、私は新しい要素を追加し、(コメントで述べたような)既存の要素を削除することを好みます。以下のコードは、属性の1つとして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

あなただけの親要素を含む `Tada`要素またはを削除したい
+0

要素名を新しいものに変更するコードを私に教えてください。ありがとうございました。その属性を取得することなく。属性をuntochedのままにしますか?ありがとうございました。私はlinqを学ぶ必要があると思います – askquestionzero

+0

私は要素名を変更するのではなく、新しい要素を追加して既存の要素を削除することを好みます。 –

+0

どうすればいいですか?あなたは私に例を教えてくれますか?要素名を削除して新しい要素を追加する方法について説明します。削除された要素の位置に?ありがとうございました。私はこの問題を解決した後、問題をチェックして病気のマーク。ありがとうございます – askquestionzero

関連する問題