2014-12-11 3 views
1

일부 XmlOverrides를 수행하고 속성을 nullable (이 경우 F1)로 설정하려고합니다. nil = "true"및이 특성 주위의 네임 스페이스를 삭제하려고하지만 시도한 메서드로 제거 할 수 없습니다. 전무 않고,XML remove nil 속성

<Nested> 
    <F1 p2:nil="true" xmlns:p2="http://www.w3.org/2001/XMLSchema-instance"/> 
    <Nest>2</Nest> 
</Nested> 

하지만 그 F1 요소가 비어 싶은와의 xmlns

<Nested> 
    <F1/> 
    <Nest>2</Nest> 
</Nested> 

답변

0

봅니다에서 중첩 클래스 [XmlElement(ElementName = "F1", IsNullable = true)]에 추가 : 내가 얻을

Nested n = new Nested(); 
n.Nest = "2"; 
n.F1 = null; 

XmlAttributeOverrides overrides = new XmlAttributeOverrides(); 

XmlAttributes att = new XmlAttributes(); 
XmlElementAttribute el = new XmlElementAttribute("F1"); 
el.IsNullable = true; 
att.XmlElements.Add(el); 
overrides.Add(typeof(Nested), "F1", att); 

XmlSerializer xs = new XmlSerializer(typeof(Nested), overrides); 

var faultDocument = new XmlDocument(); 
var nav = faultDocument.CreateNavigator(); 
var ns = new XmlSerializerNamespaces(); 
ns.Add("", ""); 

using (var writer = nav.AppendChild()) 
{ 
    xs.Serialize(writer, n, ns); 
} 

XML은 다음과 같이이다 속성 F1.

+0

할 수 없어, 나는 때문에 속성을 변경할 수 없습니다가 여러가지 이유. – gofu

0

시도 나는 그것을 할 수있는 가장 좋은 방법 확실하지, 그것을 해결하기 위해이 관리

Nested n = new Nested(); 
n.Nest = "2"; 
n.F1 = null; 

XmlAttributeOverrides overrides = new XmlAttributeOverrides(); 

XmlAttributes att = new XmlAttributes(); 
XmlElementAttribute el = new XmlElementAttribute("F1"); 
el.IsNullable = true; 
att.XmlElements.Add(el); 
overrides.Add(typeof(Nested), "F1", att); 

XmlSerializer xs = new XmlSerializer(typeof(Nested)); 

var faultDocument = new XmlDocument(); 
var nav = faultDocument.CreateNavigator(); 
StringWriter strWriter = new StringWriter(); 
XmlTextWriter TextWriter = new XmlTextWriter(strWriter); 
var ns = new XmlSerializerNamespaces(); 
ns.Add("", ""); 
xs.Serialize(TextWriter, n, ns); 
ReqXml = strWriter.ToString(); 
TextWriter.Close(); 
return ReqXml; 
0

:

private static void RemoveNils(XElement elem) 
{ 
     string nilNamespace = "{http://www.w3.org/2001/XMLSchema-instance}nil"; 
     //first condition should be enough, the rest are just fail-safes 
     if (elem.Attributes().Any(name => name.Name == nilNamespace) && elem.Elements().Count() == 0 && elem.IsEmpty) 
     { 
      elem.Attributes().Remove(); 
      return; 
     } 

     foreach (XElement el in elem.Elements()) 
      RemoveNils(el); 

}