DataSet.WriteXml不输出xsi:nil =" true"属性 [英] DataSet.WriteXml does not output the xsi:nil="true" attribute

查看:171
本文介绍了DataSet.WriteXml不输出xsi:nil =" true"属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

案例 - 读入传入的xml文件,在c#中处理,然后输出回xml

问题 - DataSet.WriteXml不是输出xsi:nil =" true"属性。

问题:我错过了一些关于WriteXml方法的内容吗?我没有看到属性来设置如何输出空值,我认为这取决于如何创建数据集 - 这应该没问题,因为传入的文件有xsi:nil =" true" .....我需要在调用WriteXml之前对数据集做什么?

更多信息:
我有一个xml文件,我正在使用DataSet.ReadXml读取其中包含null的字段值。这些在xml中标记为nillable = true。

输入文件还用xsi:nil =" true"标记空字段。属性(参见示例传入文件)。

但是......当我使用DataSet.WriteXml时,xsd不会将字段标记为nilable,并且数据中省略了空字段。

样本传入文件:

<?xml version =" 1.0" encoding =" ISO8859-1"?>
< ProDataSet xmlns:xsi =" http://www.w3.org/2001/XMLSchema-instance">
< xsd: schema xmlns:xsd =" http://www.w3.org/2001/XMLSchema"的xmlns = QUOT;" xmlns:prodata =" urn:schemas-progress-com:xml-prodata:0001">
< xsd:element name =" ProDataSet" prodata:proDataSet =" true">
< xsd:complexType>
< xsd:sequence>
< xsd:element name =" cpy_titem"的minOccurs = QUOT; 0" maxOccurs =" unbounded">
< xsd:complexType>
< xsd:sequence>
< xsd:element name =" company"类型= QUOT; XSD:串QUOT; nillable =" true" />
< xsd:element name =" item-number"类型= QUOT; XSD:串QUOT; nillable =" true" />
< xsd:element name =" gtin-code"类型= QUOT; XSD:串QUOT; nillable =" true" />

......... < cpy_titem>
< company> adi< / company>
< item-number> 01-1000< / item-number>
< gtin-code xsi:nil =" true" />
......

< ProDataSet>
< xs:schema id =" ProDataSet"的xmlns = QUOT;"的xmlns:XS = QUOT; HTTP://www.w3.org/2001/XMLSchema" xmlns:msdata =" urn:schemas-microsoft-com:xml-msdata">
< xs:element name =" ProDataSet" MSDATA:IsDataSet = QUOT;真" msdata:UseCurrentLocale =" true">
< xs:complexType>
< xs:choice minOccurs =" 0" maxOccurs =" unbounded">
< xs:element name =" cpy_titem"的minOccurs = QUOT; 0" maxOccurs =" 79228162514264337593543950335">
< xs:complexType>
< xs:sequence>
< xs:element name =" company"类型= QUOT; XS:串QUOT;的minOccurs = QUOT; 0" />
< xs:element name =" item-number"类型= QUOT; XS:串QUOT;的minOccurs = QUOT; 0" />
< xs:element name =" upc-code"类型= QUOT; XS:串QUOT;的minOccurs = QUOT; 0" />
< xs:element name =" gtin-code"类型= QUOT; XS:串QUOT;的minOccurs = QUOT; 0" />
.....

< cpy_titem>
<公司> ADI< /公司>
< ;项目号码> 01-1000< /项目数>
< UPC码> 01-1000< / UPC码>
<项目-状态>全新< /项目-状态>
< def-cost> 80.0< / def-cost>
.........

Case - incoming xml file gets read in, processed in c# and then output back to xml

Issue - DataSet.WriteXml is not outputting the xsi:nil="true" attribute.

question: am I missing something about the WriteXml method? I dont see properties to set how nulls will be output, I thought it was dependant on how the datset is created - which should be ok since the incoming file has xsi:nil="true".....do I need to do somthing to the dataset before calling WriteXml?

More Info:
I have an xml file that I am reading in with DataSet.ReadXml which has fields with null values.  These are flagged as such in the xml with nillable=true.

The incoming file also flags the null fields with the xsi:nil="true" attribute (see sample incoming file).

BUT...when I use DataSet.WriteXml, the xsd does not flag the fields as nilable and the null fields are omitted from the data.

Sample incoming file:

<?xml version="1.0" encoding="ISO8859-1"?>
<ProDataSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="" xmlns:prodata="urn:schemas-progress-com:xml-prodata:0001">
<xsd:element name="ProDataSet" prodata:proDataSet="true">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="cpy_titem" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="company" type="xsd:string" nillable="true"/>
<xsd:element name="item-number" type="xsd:string" nillable="true"/>
<xsd:element name="gtin-code" type="xsd:string" nillable="true"/>

.....
<cpy_titem>
<company>adi</company>
<item-number>01-1000</item-number>
<gtin-code xsi:nil="true"/>
......

<ProDataSet>
<xs:schema id="ProDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="ProDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="cpy_titem" minOccurs="0" maxOccurs="79228162514264337593543950335">
<xs:complexType>
<xs:sequence>
<xs:element name="company" type="xs:string" minOccurs="0" />
<xs:element name="item-number" type="xs:string" minOccurs="0" />
<xs:element name="upc-code" type="xs:string" minOccurs="0" />
<xs:element name="gtin-code" type="xs:string" minOccurs="0" />
.....

<cpy_titem>
<company>adi</company>
<item-number>01-1000</item-number>
<upc-code>01-1000</upc-code>
<item-status>New</item-status>
<def-cost>80.0</def-cost>
.....

示例传出文件(使用DataSet.WriteXml之后:

Sample outgoing file (after using DataSet.WriteXml):

推荐答案

http://msdn.microsoft.com/en-us/library/ms172138.aspx 以下内容:


以下规则适用于 DataRow的实例。[" columnName"] null赋值:

The documentation at http://msdn.microsoft.com/en-us/library/ms172138.aspx the following:

the following rules apply for an instance of DataRow.["columnName"] null assignments:



  1. 默认默认值为 DbNull.Value 除了强类型空列之外的所有列,它是适当的强类型空值。

  1. The default default value is DbNull.Value for all except the strongly typed null columns where it is the appropriate strongly typed null value.

在序列化到XML文件期间永远不会写出空值(如"xsi:nil"中所示)。

Null values are never written out during serialization to XML files (as in "xsi:nil").

所有非空值(包括默认值)始终在序列化为XML时写出。这与XSD / XML语义不同,其中空值(xsi:nil)是显式的,默认值是隐式的(如果不存在于XML中,则验证解析器可以从关联的XSD架构获取它)。对于 DataTable ,情况正好相反:空值是隐式的,默认值是显式的。

All non-null values, including defaults, are always written out while serializing to XML. This is unlike XSD/XML semantics where a null value (xsi:nil) is explicit and the default value is implicit (if not present in XML, a validating parser can get it from an associated XSD schema). The opposite is true for a DataTable : a null value is implicit and the default value is explicit.

从XML输入读取的行的所有缺失列值都指定为NULL。使用 NewRow 或类似方法创建的行被赋予DataColumn的默认值。

All missing column values for rows read from XML input are assigned NULL. Rows created using NewRow or similar methods are assigned the DataColumn's default value.

IsNull 方法返回 true DbNull.Value INullable.Null

The IsNull method returns true for both DbNull.Value and INullable.Null .

所以我担心模式语言中的xsi:nil不适用于DataSet / DataTable如何处理列中的空值。

So I am afraid xsi:nil in the schema language does not apply to how the DataSet/DataTable handles null values in columns.


这篇关于DataSet.WriteXml不输出xsi:nil =&quot; true&quot;属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆