2017-06-24 6 views
1

xmlのすべての内部ノードからxmlnsを削除する方法。私はルートノードからxmlnsを削除することができましたが、内部ノードはまだ内部ノードのすべてのxmlnsを持っています。p2を削除する:type = "<<type>" xmlns:p2 = "http://www.w3.org/2001/XMLSchema-instance"からxml

public class Program 
{ 
    public static void Main() 
    { 

     List<Person> students = new List<Person>(); 

     Student std1 = new Student() { Name="Name1", StudentId = 1}; 
     students.Add(std1); 

     Student std2 = new Student() { Name = "Name2", StudentId = 2 }; 
     students.Add(std2); 

     string data = students.ToList().ToXML(); 
    } 
} 

[System.Xml.Serialization.XmlInclude(typeof(Student))] 
public class Person 
{ 
    public string Name { get; set; } 
} 

public class Student : Person 
{ 
    public int StudentId { get; set; } 
} 

ToXML()

public static string ToXML<T>(this T value) 
    { 
     if (value.IsNull()) return string.Empty; 

     var xmlSerializer = new XmlSerializer(typeof(T)); 
     XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
     ns.Add("", ""); 

     using (var stringWriter = new StringWriter()) 
     { 
      using (var xmlWriter = XmlWriter.Create(stringWriter, new XmlWriterSettings { OmitXmlDeclaration = true, Indent = false })) 
      { 
       xmlSerializer.Serialize(xmlWriter, value, ns); 
       return stringWriter.ToString(); 
      } 
     } 
    } 

出力

<ArrayOfPerson> 
    <Person p2:type="Student" xmlns:p2="http://www.w3.org/2001/XMLSchema-instance"> 
     <Name>Name1</Name> 
     <StudentId>1</StudentId> 
    </Person> 
    <Person p2:type="Student" xmlns:p2="http://www.w3.org/2001/XMLSchema-instance"> 
     <Name>Name2</Name> 
     <StudentId>2</StudentId> 
    </Person> 
</ArrayOfPerson> 

の予想される出力は

<ArrayOfPerson> 
    <Person> 
     <Name>Name1</Name> 
     <StudentId>1</StudentId> 
    </Person> 
    <Person> 
     <Name>Name2</Name> 
     <StudentId>2</StudentId> 
    </Person> 
</ArrayOfPerson> 
+0

を、あなたは 'NamespaceHandling'が'に設定したことがありますOmitDuplicates'? –

+0

@AmitJoshiは役に立たなかった –

答えて

0

あなたのコード内のXMLシリアル化を実行した後、あなたがRemoveAllNamespacesを適用することができますされています()関数からこの回答: あなたがPersonのリストを直列化しているが、Studentのサブタイプを使用しているので、これが追加されているHow to remove all namespaces from XML with C#?

+0

ありがとう、私はそれを通過しましたが、私はToXML()で追加することができますシンプルでエレガントなソリューションを探しています、また、リアルタイムで私のリストのオブジェクト数千パフォーマンスも心配です –

0

。タイプ属性は、シリアライザが使用されている実際のタイプを判別するために必要です。

あなたはこれらの属性をしたくないとあなただけの「人」のシングルタイプを持っている場合は、StudentPersonの定義が崩壊する必要があります。

public class Person 
{ 
    public string Name { get; set; } 
    public int StudentId { get; set; } 
} 
関連する問題