2011-05-12 6 views
7

내가 가지고있는 것처럼 XML 파일 : 나는 같은 새 항목 생성 C 번호와XElement를 추가 접두사 만

<myPrefix:Catalog xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:sys="clr-namespace:System;assembly=mscorlib" 
xmlns:myPrefix="clr-namespace:........"> 

    <myPrefix:Item Name="Item1" Mode="All" /> 
    <myPrefix:Item Name="Item2" Mode="Single" /> 

</myPrefix:Catalog> 

: 당신은 내가 "myPrefix"추가하지 마십시오 볼 수 있듯이

XContainer container = XElement.Parse(xml); 
XElement xmlTree = 
    new XElement("Item", 
     new XAttribute("Name", item.Name), 
     new XAttribute("Mode", item.Mode)); 

을 접두사. 아무도 내가 그걸 어떻게 할 수 있는지 말해 줄 수 있니? xmlns를 다시 선언하고 싶지 않습니다. 감사합니다, 피터

답변

3

편집 1 :
네임 스페이스를 추가하는 경우
이 접두사를 추가하도록 강제 요소에 aswell 때문이다. 하지만 노드의 xmlns 속성은 여전히 ​​끝납니다. 제거하려면 Jeff가 말했듯이 XmlWriter를 사용해야합니다.

편집 2 :
당신이 aswell 루트 요소를 만들 필요가 원하는 정확한 XML을 활용하려면 다음

편집 3 :
확인을 클릭합니다. 내가 XmlWriter를하지 않고 당신이 원하는 것을 얻을 수있는 방법을 발견 :

var xml = "<myPrefix:Catalog xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\" xmlns:myPrefix=\"clr-namespace:........\"><myPrefix:Item Name=\"Item1\" Mode=\"All\" /></myPrefix:Catalog>"; 

XNamespace presentation = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"; 
XNamespace xaml = "http://schemas.microsoft.com/winfx/2006/xaml"; 
XNamespace mscorlib = "clr-namespace:System;assembly=mscorlib"; 
XNamespace myPrefix = "clr-namespace:......."; 

XElement container = XElement.Parse(xml); 

var xmlTree = new XElement("Item", 
       new XAttribute("Name", "Item2"), 
       new XAttribute("Mode", "Single")); 

container.Add(xmlTree); 

foreach (var el in container.DescendantsAndSelf()) 
{ 
    el.Name = myPrefix.GetName(el.Name.LocalName); 
    var atList = el.Attributes().ToList(); 
    el.Attributes().Remove(); 
    foreach (var at in atList) 
    { 
    if (el.Name.LocalName == "Catalog" && at.Name.LocalName != "xmlns") 
     continue; 
    el.Add(new XAttribute(at.Name.LocalName, at.Value)); 
    } 
} 

container.Add(new XAttribute(XNamespace.Xmlns + "x", xaml)); 
container.Add(new XAttribute(XNamespace.Xmlns + "sys", mscorlib)); 
container.Add(new XAttribute(XNamespace.Xmlns + "myPrefix", myPrefix)); 

편집 4 :
은 분명히 쉬운 방법이 있었다 ... 훨씬 쉽게 ... 다른 답변을 참조하십시오.

+0

답장을 보내 주셔서 감사 합니다만 작동하지 않습니다. 결과는 다음과 같습니다 : Peter

+1

@Peter : 요소가 뿌리. 루트가 아니므로 조상에서 네임 스페이스가 선언 된 경우 접두사가 붙습니다. –

+0

@Jeff 어떻게하면 제대로 작동하게 할 수 있습니까? – Peter

7
XElement container = XElement.Parse(xml); 
    XNamespace myPrefix = container.GetNamespaceOfPrefix("myPrefix"); 

    XElement xmlTree = new XElement(myPrefix + "Item",  
          new XAttribute("Name", item.Name), 
          new XAttribute("Mode", item.Mode)); 

    container.Add(xmlTree); 
+0

+1 니스! 나는 쉬운 방법이 있어야한다는 것을 알았다. –

2

네임 스페이스에 새 요소를 구성해야합니다. XML 샘플에서 원하는 네임 스페이스의 접두사를 알고 있다고 가정하면 다음과 같이하십시오.

var xml = "<myPrefix:Catalog xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\" xmlns:myPrefix=\"clr-namespace:........\"><myPrefix:Item Name=\"Item1\" Mode=\"All\" /></myPrefix:Catalog>"; 

    XElement catalog = XElement.Parse(xml); 

    XNamespace myP = catalog.GetNamespaceOfPrefix("myPrefix"); 

    catalog.Add(new XElement(myP + "Item", new XAttribute("Name", "foo"), new XAttribute("Mode", "bar"))); 
+0

+1 니스!나는 쉬운 방법이 있어야한다는 것을 알았다. –

+0

이 멋진 솔루션에 대해 감사드립니다. – Peter

관련 문제