小智 13
纯粹C#的另一种方式 - 为子孙后代:
using (var memoryStream = new MemoryStream())
{
using (var xmlWriter = XmlWriter.Create(memoryStream))
{
xmlWriter.WriteString(xmlData.ToString().Trim());
return new System.Data.SqlTypes.SqlXml(memoryStream);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的C#转换方法版本.
public static SqlXml ConvertString2SqlXml(string xmlData)
{
UTF8Encoding encoding = new UTF8Encoding();
MemoryStream m = new MemoryStream(encoding.GetBytes(xmlData));
return new SqlXml(m);
}
Run Code Online (Sandbox Code Playgroud)
我不太喜欢它,因为我本来希望MemoryStream有一个使用块,但这给了我:
无法访问已处置的对象.对象名称:'关闭流时无效尝试调用Read.'.
我愿意接受这个问题,因为这个代码只用于单元测试,我想用SqlXml参数测试一个SqlFunction,它将被部署到SQL Server CLR.
由于以下问题,ReinhardtB的答案对我不起作用:当用xmlData调用它时"<?xml version=\"1.0\" encoding=\"utf-8\"?><test></test>"(反斜杠在C#字符串文字中),我得到:
System.InvalidOperationException发生Message = Token文本处于Start状态会导致XML文档无效.如果要编写XML片段,请确保将ConformanceLevel设置设置为ConformanceLevel.Fragment或ConformanceLevel.Auto.
通过以下修改可以轻松解决此问题:
XmlWriterSettings settings = new XmlWriterSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;
using (var xmlWriter = XmlWriter.Create(memoryStream, settings))
Run Code Online (Sandbox Code Playgroud)
但是,这导致了以下异常:
发生System.ObjectDisposedException Message =无法访问已处置的对象.对象名称:'关闭流时无效尝试调用Read.'.来源= System.Data
这个,我可以通过省略MemoryStream的使用块(这当然是一个坏主意)来解决下一个问题:当检查SqlXml,SqlXml.Value的值时,我发现它包含值<?xml version="1.0" encoding="utf-8"?><test></test>,也就是说,<和>已被逃脱!这看起来像是SqlXml类型的严重问题.
我知道这已得到回答,但这些答案似乎都不适合我.相反,我采用另一种方法使用这个oneliner
var sqlXml = new SqlXml(new XmlTextReader(new StringReader(stringToParseToSqlXml)));
然而,这是泄漏,但将其更改为:
using (var reader = new StringReader(stringToParseToSqlXml))
{
using (var xmlreader = new XmlTextReader(reader))
{
var sqlXml = new SqlXml(xmlreader);
// Do other stuff
}
}
Run Code Online (Sandbox Code Playgroud)
我用过这个,它似乎对我有用.