忽略SAS V8中的空白对XML进行沙漠化

本文关键字:XML 沙漠化 空白 SAS V8 忽略 | 更新日期: 2023-09-27 18:22:10

我有一些由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

这个类似问题的答案建议在读取字符串时对其进行修剪,但在反序列化过程中如何实现呢?

我愿意接受建议,包括更改创建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-and-replace对我来说是错误的——我总是更喜欢在对.net进行初始写入或读取时进行更改。

我在这里找到了一个很好的答案,因此这个问题可能是这个问题的重复。

我得到的代码如下:

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

忽略SAS V8中的空白对XML进行沙漠化

在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;

这是所有在v8中应该可以正常工作的基本SAS代码。从表面上看,它假设您的数据不包含字符串'> '' <'——然而,由于SAS在导出到XML时转义XML风格的字符,除非您在libname语句中指定xmlprocess=relax,否则这不太可能是一个问题。

修剪前的样品行:

<Name> Alfred </Name>

修剪后的样品行:

 <Name>Alfred</Name>

xml转义代码示例:

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

结果xml:

  <str> &gt; </str>