【发布时间】:2016-02-18 18:42:26
【问题描述】:
我有一些由 SAS V8 例程创建的 XML,我将其反序列化为一个对象。出于某种原因,SAS 似乎在每个值的开头和结尾添加了空格。
<ROWSET>
<ROW>
<value1> 1 </value1>
<value2> SOMEVALUE </value2>
<value3 />
</ROW>
</ROWSET>
我想也许我可以从 XmlReader 反序列化并设置为忽略空格,但它似乎不起作用(空格仍然存在)。
Public Function GetData(FileName As String) As ObjectModel
Using r As Xml.XmlReader = Xml.XmlReader.Create(FileName, New Xml.XmlReaderSettings With {.IgnoreWhitespace = True})
Dim o As New ObjectModel
Dim x As New XmlSerializer(o.GetType)
Return x.Deserialize(r)
End Using
End Function
This 对类似问题的回答建议在读取字符串时修剪字符串,但在反序列化期间如何实现相同的效果?
我愿意接受建议,包括更改创建 XML 的 SAS V8 代码,但它必须是 SAS V8 代码,而不是 V9。
创建 XML 的 SAS 代码如下,我使用 xmltype=oracle,因为它似乎是 V8 的最佳输出选项。
libname myxml xml "&output..\xmldata.xml" xmltype=oracle;
data myxml.xmldata;
set area.xmldata;
run;
请随时用 c# 或 vb 给出答案。
编辑 虽然下面的答案有效,但使用查找和替换对我来说感觉不对 - 我总是更喜欢在进行初始写入或读入 .net 时进行更改。
我找到了一个很好的答案here,因此这个问题可能与this question 重复。
我的结果代码如下:
Public Class SasXmlTextReader
Inherits Xml.XmlTextReader
Public Sub New(stream As IO.Stream)
MyBase.New(stream)
End Sub
Public Overrides Function ReadString() As String
Return MyBase.ReadString().Trim()
End Function
End Class
Public Function GetDefects(FileName As String) As ObjectModel
Using s As New IO.StreamReader(FileName)
Using r As New SasXmlTextReader(s.BaseStream)
Dim df As New ObjectModel
Dim x As New XmlSerializer(df.GetType)
Return x.Deserialize(r)
End Using
End Using
End Function
【问题讨论】:
标签: c# .net vb.net sas xml-deserialization