2016-07-14 4 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> 

원하는 출력 : 방금 요소를 찾아으로 Remove를 호출 할 수 LinqXml에 사용 나는 XDocument를 사용하여 선호

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

? 예상 출력을 포함 시키면 도움이됩니다. –

+0

질문이 업데이트됩니다. – askquestionzero

답변

1

, 표시됩니다.

다른 질문에 대해서는 속성을 제거하려는 경우 동일한 논리 (이와 비슷한 것)를 사용할 수 있습니다.

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

당신은 단지 부모 요소를 포함하는`Tada` 요소 또는 제거 할
+0

엘리먼트 이름을 새로운 것으로 변경하는 코드를 줄 수 있습니까? 고맙습니다. 그 속성을 얻지 않고. 속성을 untoched 상태로 둡니까? 고맙습니다. 그리고 나는 linq을 배울 필요가 있다고 생각한다. – askquestionzero

+0

나는 엘리먼트 이름을 바꾸는 것을 선호하지 않는다. 오히려 나는 새로운 엘리먼트를 추가하고 기존 엘리먼트를 제거 할 것이다. –

+0

나는 그 선생님을 어떻게 할 수 있습니까? 예를 들어 주시겠습니까? 요소 이름을 제거하고 새 요소를 추가하는 방법에 대해 설명합니다. 요소가 제거 된 위치에 있습니까? 고맙습니다. 내가이 문제를 해결 한 후 질문을 확인한 것입니다.감사합니다 – askquestionzero