反序列化XML忽略SAS V8中的空格

时间:2015-11-17 11:50:09

标签: c# .net vb.net sas xml-deserialization

我有一些由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中给出答案。

修改 虽然下面的答案有效,但使用find和replace对我来说感觉不对 - 我总是喜欢在进行初始写入或读入.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

1 个答案:

答案 0 :(得分:0)

在SAS中解决此问题的一种粗略方法如下:

libname myxml xml "c:\temp\xmldata.xml"  xmltype=oracle;
data myxml.xmldata;
  set sashelp.class;
run;

data _null_;
  infile "c:\temp\xmldata.xml";
  file "c:\temp\xmldata_trimmed.xml";
  input;
  _INFILE_ = tranwrd(_INFILE_,'> ','>');
  _INFILE_ = tranwrd(_INFILE_,' <','<');
  put _INFILE_;
run;

这是所有基本的SAS代码,应该在v8中正常工作。从表面看,它假定您的数据不包含字符串'> '' <' - 但是,因为SAS在导出到xml时转义XML-ish字符,除非您在libname中指定xmlprocess=relax声明,这不太可能是一个问题。

修剪前的样本行:

<Name> Alfred </Name>

修剪后的示例行:

 <Name>Alfred</Name>

xml转义示例 - 代码:

data myxml.example;
  str='>';
  output;
run;

产生的xml:

  <str> &gt; </str>