【问题标题】:Deserialise XML ignoring whitespace from SAS V8反序列化 XML 忽略来自 SAS V8 的空格
【发布时间】: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


【解决方案1】:

在 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 代码。从表面上看,它假定您的数据不包含字符串 '&gt; '' &lt;' - 但是,除非您在 libname 语句中指定 xmlprocess=relax,否则 SAS 在导出到 xml 时会转义 XML-ish 字符,这不太可能担心。

修剪前的示例行:

<Name> Alfred </Name>

修剪后的示例行:

 <Name>Alfred</Name>

xml转义示例-代码:

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

生成的 xml:

  <str> &gt; </str>

【讨论】:

  • 嗯,这不是我想要的优雅的解决方案,只是让 SAS 对文本进行查找和替换吗?它需要替换字符串' &gt;''&lt; ',而不是'&gt; '' &lt;'
  • 是的,这是简单的字符串替换,不,所做的替换是正确的。
  • 是的,是的,大脑放屁时刻哈哈 - 我已经为这项努力投了赞成票,但我不能确定我的数据中没有 '&gt; ',所以我将不得不尝试更优雅的东西
  • 实际上,您可以 - SAS 在导出到 xml 时转义 XML-ish 字符,除非您在 libname 语句中指定 xmlprocess=relax
  • 在这种情况下,这不是我想要的解决方案,但我认为对于想要在没有填充的情况下从 sas v8 中获取 xml 数据的人来说,这是一个很好的解决方案,所以我将标题更改为位并给了你答案:)
猜你喜欢
  • 2012-09-17
  • 2021-02-17
  • 2013-08-17
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 2016-06-23
相关资源
最近更新 更多