2010-09-03 168 views
1

在XSD中Minoccurs爲0,對於某個元素,nillable爲true。如何省略XSD中生成的C#XML中的XML元素?

但是,如果我沒有設置元素值,它將其作爲空值並將記錄在服務器上消隱。有一種方法可以告訴它在某些條件滿足時從輸出XML中省略該元素,但在其他情況下可以使用該元素嗎?

<xs:element name='CLS_CD' minOccurs='0' nillable='true' type='xdv:stringLen20'/> 
+0

請發佈您的代碼/背景。 – 2010-09-03 01:53:33

回答

2

如果使用,可以控制值是否被包括PropertyNameSpecified屬性發出的。

另一種方法是使用一種特殊的 模式創建由XmlSerializer的認可布爾字段 ,並 到XmlIgnoreAttribute應用於 領域。該模式在propertyNameSpecified的 表單中創建。對於 例如,如果有一個名爲 「MyFirstName」字段中,您也將創建一個名爲 場「MyFirstNameSpecified」 指示XmlSerializer的 是否生成名爲「MyFirstName」的XML元素 。

例如,如果你聲明類是這樣的:

public class Data 
{ 
    [XmlIgnore] 
    public bool CLS_CDSpecified { get; set; } 
    [XmlElement(IsNullable=true)] 
    public string CLS_CD { get; set; } 
} 

然後可以序列什麼,一個明確的零值或實際值:

var serializer = new XmlSerializer(typeof(Data)); 

var serializesNothing = new Data(); 
serializesNothing.CLS_CD = null; 
serializesNothing.CLS_CDSpecified = false; 
serializer.Serialize(Console.Out, serializesNothing); 
Console.WriteLine(); 
Console.WriteLine(); 

var serializesNil = new Data(); 
serializesNil.CLS_CD = null; 
serializesNil.CLS_CDSpecified = true; 
serializer.Serialize(Console.Out, serializesNil); 
Console.WriteLine(); 
Console.WriteLine(); 

var serializesValue = new Data(); 
serializesValue.CLS_CD = "value"; 
serializesValue.CLS_CDSpecified = true; 
serializer.Serialize(Console.Out, serializesValue); 

輸出:

<?xml version="1.0" encoding="IBM437"?> 
<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> 

<?xml version="1.0" encoding="IBM437"?> 
<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <CLS_CD xsi:nil="true" /> 
</Data> 

<?xml version="1.0" encoding="IBM437"?> 
<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <CLS_CD>value</CLS_CD> 
</Data>