C# 将xml数据传递到字符串中用作参数

C# 将xml数据传递到字符串中用作参数,c#,xml,C#,Xml,在处理xml和正确使用xml方面有困难。因此,我正在创建一个测试方法,其中一个参数是xml数据,我不知道如何传递它 服务 public IEnumerable<Submissions> CheckingOutForUserReview(string data) { var _submissions = DataContextManager.StoredProcs.CheckingOutForUserReview<SSubmissions&

在处理xml和正确使用xml方面有困难。因此,我正在创建一个测试方法,其中一个参数是xml数据,我不知道如何传递它

服务

public IEnumerable<Submissions> CheckingOutForUserReview(string data)
        {
            var _submissions = DataContextManager.StoredProcs.CheckingOutForUserReview<SSubmissions>(data, s => new Submissions
            {
               QRCodeGUID = SubmissionsColumnMap.QRCodeGUID(s),
               StoragePath = SubmissionsColumnMap.StoragePath(s),
               UploadedByUsersID = SubmissionsColumnMap.UploadedByUsersID(s)
            });

            return _submissions;
        }
public IEnumerable CheckingOutForUserReview(字符串数据)
{
var\u submissions=DataContextManager.StoredProcs.CheckingOutForUserReview(数据,s=>新提交
{
QRCodeGUID=SubmissionsColumnMap.QRCodeGUID,
StoragePath=SubmissionsColumnMap.StoragePath,
UploadedByUsersID=SubmissionsColumnMap.UploadedByUsersID(s)
});
返回(u)意见书;;
}
存储过程:

public virtual IEnumerable<T> CheckingOutForUserReview<T>(string data, Func<IDataRecord, T> modelBinder)
        {
            SqlCommand _command = new SqlCommand("dbo.CheckingOutForUserReview");
            _command.CommandType = CommandType.StoredProcedure;
            _command.Parameters.Add(new SqlParameter { ParameterName = "Data", SqlDbType = SqlDbType.Xml, Value = data });
            return DbInstance.ExecuteAs<T>(_command, modelBinder);
        }
公共虚拟IEnumerable CheckingOutForUserReview(字符串数据,Func modelBinder)
{
SqlCommand _command=newsqlcommand(“dbo.CheckingOutForUserReview”);
_command.CommandType=CommandType.storedProcess;
_Add(新的SqlParameter{ParameterName=“Data”,SqlDbType=SqlDbType.Xml,Value=Data});
返回DbInstance.ExecuteAs(_命令,modelBinder);
}
这是我的测试方法:

    public void CheckingOutForUserReview()
            {
string _data = @"<CheckingOutForUserReview xmlns:i=""www.w3.org/2001/XMLSchema-instance"" xmlns=""schemas.name.com/2013/03/Malt.Models"">
                                <Record>
                                <QRCodeID>2FAC636E-F96C-4465-9272-760BAF73C0DF</QRCodeID>
                                <SubmissionID>10B5236C-47FD-468D-B88D-D789CA0C663A</SubmissionID>
                                <UserID>1</UserID>
                                <Page>1</Page>
                                </Record>
                            </CheckingOutForUserReview>";
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(_data);
            var _Svc = new SubmissionsService();
            var _checkins = _Svc.CheckingOutForUserReview(doc.InnerXml);
        }
public void CheckingOutForUserReview()
{
字符串_data=@”
2FAC636E-F96C-4465-9272-760BAF73C0DF
10B5236C-47FD-468D-B88D-D789CA0C663A
1.
1.
";
XmlDocument doc=新的XmlDocument();
doc.LoadXml(_数据);
var_Svc=新提交服务();
var\u checkins=\u Svc.CheckingOutForUserReview(doc.InnerXml);
}
更新: 我的CheckingOutForUserReview()方法接受一个XmlDocument,因为我将它更改为存储过程中的XmlDocument,而我当前拥有的是一个错误,即我有无效的参数(System.Xml.XmlDocument),不确定我是否在某个地方出错


如果这是一种不同的方式,我也乐于尝试新的方式。谢谢你的帮助

正如我在评论中所说,我认为最好的方法是将XML保存到一个单独的文件中

如果不想这样做,可以使用逐字字符串文字(请注意双引号):

字符串数据=@”
2FAC636E-F96C-4465-9272-760BAF73C0DF
10B5236C-47FD-468D-B88D-D789CA0C663A
1.
1.
";

我认为有两种方法:

  • 您应该通过在xml文件中添加xml文件来将xml保存到xml文件中 project然后使用加载方法将其与XmlDocument一起使用,如:

    XmlDocument doc = new XmlDocument.Load(FileName);
    ...
    ...
    var _checkins = _Svc.CheckingOutForUserReview(doc.innerXml);
    
    XmlDocument doc = new XmlDocument.LoadXml(stringThatContainsXml);
    ...
    ...
    var _checkins = _Svc.CheckingOutForUserReview(doc.innerXml);
    
  • 将xml另存为字符串文本,并使用 LoadXml方法,如:

    XmlDocument doc = new XmlDocument.Load(FileName);
    ...
    ...
    var _checkins = _Svc.CheckingOutForUserReview(doc.innerXml);
    
    XmlDocument doc = new XmlDocument.LoadXml(stringThatContainsXml);
    ...
    ...
    var _checkins = _Svc.CheckingOutForUserReview(doc.innerXml);
    
  • 您也可以使用XDocument和XElement类,但我对XmlDocument的关注是,它也适用于小于3.5的框架,因为
    XDocument
    XElement
    是在框架3.5中引入的

    此外,将xml加载到解析器将有助于过滤出无效的xml。(如果错误尝试使用)

    我在你的片段中注意到了另一件事:

    Assert.IsNotNull(_data);
    
    它应该在
    \u Svc
    初始化之前出现,因为如果
    中没有数据,那么初始化就没有意义

    因此,您的代码如下所示:

    public void CheckingOutForUserReview()
    {
        string _data = "I want to pass in xml here";
    
        Assert.IsNotNull(_data);  <--------------- See the re-ordering
    
        var _Svc = new SubmissionsService();
        var _checkins = _Svc.CheckingOutForUserReview(_data);
    }
    
    public void CheckingOutForUserReview()
    {
    string _data=“我想在这里传递xml”;
    
    IsNotNull(_data);我不知道将任何类型的字符串作为参数传递到方法中有什么问题


    如果XML是从代码生成的,那么最好使用StringBuilder来构建它,以减少在连接字符串时创建新引用

    如果XML最初来自文件,请将文件路径传递到方法中,然后在那里打开文档。打开和读取XML文档,或者将字符串加载到XML文档并将其作为XML而不是字符串处理,有很多不同的方法

    示例:

    最后来自MSDN:


    享受

    你不能将XML保存到一个单独的文件中,然后从那里加载它吗?另外,你的XML无效,你打开一次
    ,然后关闭两次。@斯维克,所以在测试方法本身中没有办法这样做吗?我只想测试并确保返回我需要的内容。谢谢你捕获关闭记录的标记。是吗使用字符串而不是XElement来处理xml本身有什么原因吗?@johnv2020没有,没有其他原因,我不知道最好的方法是什么。第一次用这种方式处理xml。如果不知道您想用xml做什么,很难说清楚-但一般来说,您应该明确使用xml类型、XElement或XDocument在处理xml数据而不是简单的字符串时,每天都学习一些东西,不知道可以使用
    而不是
    \”
    @Bob。嗯,不完全是这样,您可以使用普通字符串文字和
    \”
    ,例如
    “\”
    ,也可以使用逐字字符串文字和
    ,例如,
    @”
    @downvoter Care要解释一下你认为这个答案有什么错吗?我认为它完全符合问题的要求。我真的看不出有什么理由与6年前发布的、3年来被4.0超越的内容兼容。在我看来,这应该是你编写代码的首选方式。@Default,I如果某个东西在所有框架中都得到支持,我更喜欢它,而且它肯定会影响代码的编写方式(比如说由LINQ实现)。这只是我的观点。@Neverless感谢您分享的所有信息。我尝试过进行更改(上面的更新)但是我遇到了错误,因为我将xml的参数从
    stringdata
    更改为
    xmldocumentdata
    类型,而不是sur