反序列化 XML 忽略来自 SAS V8 的空格
Deserialise XML ignoring whitespace from SAS V8
我有一些 XML 由 SAS V8 例程创建,我正在反序列化为一个对象。出于某种原因,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, and as such this question is probably a duplicate of 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
在 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-ish 字符xmlprocess=relax
在 libname 语句中,这不太可能成为问题。
修剪前的示例行:
<Name> Alfred </Name>
修剪后的样本行:
<Name>Alfred</Name>
xml 转义示例 - 代码:
data myxml.example;
str='>';
output;
run;
结果xml:
<str> > </str>
我有一些 XML 由 SAS V8 例程创建,我正在反序列化为一个对象。出于某种原因,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, and as such this question is probably a duplicate of 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
在 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-ish 字符xmlprocess=relax
在 libname 语句中,这不太可能成为问题。
修剪前的示例行:
<Name> Alfred </Name>
修剪后的样本行:
<Name>Alfred</Name>
xml 转义示例 - 代码:
data myxml.example;
str='>';
output;
run;
结果xml:
<str> > </str>