2009-12-18 117 views
8

我有一个值为空白的XML节点。示例:在C#中,如何获得空白的XML节点值?

<sampleNode> </sampleNode> 

我正在使用串行器从XML文档中获取数据以将其存储在对象中。现在,我面临的问题是:如果XML节点值不包含空白,就像上面的示例节点一样,序列化程序将其解释为一个字符串.Empty。

我该如何克服这个问题?我需要得到实际的空白,即“”。谢谢一堆!

+0

谢谢俄德,菲尔和Laurent你的快速反应和正确的答案。你所有的答复都是真实的 - 但是,我的问题仍然没有解决。以下是我用来将XML文件转换为对象的方法: StreamReader SR = new StreamReader(File.Open(Path,FileMode.Open)); XmlSerializer Serializer = new XmlSerializer(typeof(MyType)); MyType obj =(MyType)Serializer.Deserialize(SR); return obj; 还有什么想法吗? – Boris 2009-12-18 09:11:49

回答

11

假设你正在使用XmlDocument的,你应该PreserveWhiteSpace属性设置为True。

如果使用和XmlReader设置WhitespaceHandling属性WhitespaceHandling.All。

请参阅this有关在序列化时保留空白区域的MSDN文章。

不同的串行器处理这种不同的方式,尝试使用XmlTextReader为此,根据this论坛帖子。

+0

不幸的是,即使你的解决方案是完全正确的,我也不能将它应用到我的代码中,因为我既没有使用XmlDocument也没有使用XmlReader。我已经添加了将XML文件转换为帖子评论中的对象的代码。 – Boris 2009-12-18 09:13:48

+0

那么,你知道些什么:我开始使用XmlReader:D 非常感谢你的回答! – Boris 2009-12-18 09:26:53

1

您可以使用CDATA占位符,以避免去除空间:

<sampleNode><![CDATA[ ]]></sampleNode> 
+0

即使认为您的解决方案可以解决我的问题,但我会给予人们更多的时间来尝试克服我面临的更优雅的解决方案所面临的XmlSerializer问题。但是,如果没有人提出更好的想法,我会将你的答案标记为正确的。 – Boris 2009-12-18 09:18:19

+0

您是否尝试过使用“ ”实体?我只是关于它而已。 – 2009-12-18 09:52:21

4

Sample类:

using System; 

namespace GeneralTesting 
{ 
    [Serializable] 
    public class SampleNode 
    { 
     public string sampleNode = " "; 
    } 
} 

而且样本程序:

XmlSerializer xmls = new XmlSerializer(typeof(SampleNode)); 
    SampleNode sn = new SampleNode(); 
    using (FileStream fs = File.Open(@"C:\test.xml", FileMode.Create)) 
    { 
     xmls.Serialize(fs, sn); 
    } 
    using (FileStream fs = File.OpenRead(@"C:\test.xml")) 
    { 
     XmlReaderSettings xmlrs = new XmlReaderSettings(); 
     xmlrs.IgnoreWhitespace = false; 
     using (XmlReader xmlr = XmlReader.Create(fs, xmlrs)) 
     { 
      Console.WriteLine("!{0}!", ((SampleNode) xmls.Deserialize(xmlr)).sampleNode); //output: ! ! 
     } 
    } 
+1

感谢您的回答,并提供了XmlReader用法的一个很好的示例。 – Boris 2009-12-18 09:27:28