2013-02-18 50 views
1

我在我的应用程序添加功能元素的名称,其中一个DataTable转换成XML,就像这样:Datatable.WriteXml - 如何保持空格

dtResults.WriteXml(fileName); 

_x0020_被加入,而不是空间内的输出XML文档。

是否有可能在没有_x0020_的代码的情况下生成XML文件?即可以使用该方法或类似方法生成XML文件,并且实际上保留了空格?

这是在DataGrid:

enter image description here

这是生成的XML:

<Customers> 
    <Customer_x0020_Name>Sean</Customer_x0020_Name> 
    </Customers> 
    <Customers> 
    <Customer_x0020_Name>John</Customer_x0020_Name> 
    </Customers> 
    <Customers> 
    <Customer_x0020_Name>Sarah</Customer_x0020_Name> 
    </Customers> 
    <Customers> 
    <Customer_x0020_Name>Mark</Customer_x0020_Name> 
    </Customers> 
    <Customers> 
    <Customer_x0020_Name>Norman</Customer_x0020_Name> 
    </Customers> 
+0

20是空间的十六进制值。请根据你的意思更具体。 – 2013-02-18 20:11:11

+0

我想要在XML文件中生成空格,而不是空格的十六进制代码。它甚至有可能吗? – 2013-02-18 20:13:21

+0

你能展示一个正在输出的XML的例子吗?你在哪里看到十六进制数字? – 2013-02-18 20:14:45

回答

6

列的名称包含空格。 XML元素名称不能包含空格。的空间被以XML用于元素名称从属性名称分开,例如:

<ElementName Attribute1="value" /> 

DataTable.WriteXml方法尝试写出来的XML文件以一致的方式,使另一个DataTable对象稍后可以用于加载XML并尽可能接近原始副本。因此,它用它们的十六进制值替换非法字符,以便在翻译时不会丢失非法字符。

所以,如果你想不同的看法写XML,你需要:

  • 变化在DataTable列的名称,以便它不包含空格
  • 手动输出将XML自己使用XDocumentXmlDocumentXmlWriter,或XmlSerializer但是和格式化输出你的愿望
  • 输出你现在要做的XML,但随后在其上运行的XSLT脚本来修正格式
+1

感谢您的信息! +1 :) – 2013-02-18 20:32:32

+1

+1 :)今天来了一个以数字开头的xml元素(根据[XML规范](http://www.w3.org/TR/REC-xml/#也是无效的) NT-Name)。像<1_xyz>这样的元素得到数字1的十六进制表示(<_x0031__xyz>),并且<11_xyz>将得到<_x0031__1_xyz> – 2014-02-25 14:01:54

2

我不觉得有什么你想是可能的。我不相信XML元素名称可以包含空格,就像变量名称不能包含空格一样。它需要成为一个空间的原因是什么?

如果实际上需要一个空间(我认为这会导致xml无法解析),那么您可以简单地在文件中进行查找和替换。

如果要存储它以便读回数据表并再次显示在DataTable中,我只需重新读取数据就可以重新命名列,用空格替换_x0020_

+1

感谢您的信息! +1 :) – 2013-02-18 20:31:19

0

我也面临同样的问题。我从一个包含空格的列导出excel文件中的数据。所以我的专栏也包含空间。 所以我试了下面的方式。

StringWriter strXML = new StringWriter(); 
dtPartOriginalData.WriteXml(strXML, XmlWriteMode.IgnoreSchema, false); 
strMessages = strXML.ToString().Replace("_x0020_", ""); 

这将取代_x0020_并生成xml。但是你不能用这个xml构造相同的数据表。它是一种解决方法,我想加入它作为一个建议。谢谢。