2

无法处理 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 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);
        }

这是我的测试方法:

    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);
        }

更新: 我的 CheckingOutForUserReview() 方法接受一个 XmlDocument,因为我在我的存储过程中将它更改为那个,并且我目前拥有它给出一个错误,我有无效的参数(System.Xml.XmlDocument)不确定我是否在某个地方搞砸了.

如果这是一种不同的方式,我也愿意尝试新的方式。谢谢您的帮助。

4

3 回答 3

0

就像我在评论中所说的那样,我认为最好的方法是将 XML 保存到一个单独的文件中。

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

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>";
于 2013-06-17T20:21:44.207 回答
0

如我所见,有两种方法:

  1. 您应该通过在项目中添加 xml 文件将 xml 保存到 xml 文件中,然后使用Load方法将其与 XmlDocument 一起使用,例如:

    XmlDocument doc = new XmlDocument.Load(FileName);
    ...
    ...
    var _checkins = _Svc.CheckingOutForUserReview(doc.innerXml);
    
  2. 将您的 xml 保存为字符串文字,并使用 LoadXml方法将其与 XmlDocument 一起使用,例如:

    XmlDocument doc = new XmlDocument.LoadXml(stringThatContainsXml);
    ...
    ...
    var _checkins = _Svc.CheckingOutForUserReview(doc.innerXml);
    

您也可以使用XDocumentXElement类,但我对XmlDocument的关注是它也适用于低于 3.5 的框架,因为XDocumentXElement是在框架 3.5 中引入的。

还将 xml 加载到解析器中将有助于过滤掉无效的 xml。(如果错误地尝试使用)

我在您的代码段中注意到的另一件事:

Assert.IsNotNull(_data);

它应该在 的初始化之前_Svc,因为如果_data初始化中没有数据是没有意义的。

所以你的代码看起来像:

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);
}
于 2013-06-18T05:53:16.697 回答
0

我看不出将任何类型的字符串作为参数传递给方法有什么问题

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

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

例子:

http://www.codeproject.com/Articles/24375/Working-with-XML

http://forum.codecall.net/topic/58239-c-tutorial-reading-and-writing-xml-files/

最后来自 MSDN:

http://msdn.microsoft.com/en-us/library/aa288481%28v=vs.71%29.aspx

请享用

于 2013-06-18T06:01:51.443 回答