XmlReader跳过发送到webservice的一半数据

时间:2010-06-18 13:39:02

标签: .net xml web-services

我有一个有一种方法的网络服务:

[WebMethod]
public bool SyncUserData(string userxml)

xml是一系列用户记录,我使用XmlReader来读取数据并对其进行处理。

当我使用2000条记录调用Web服务时,它会处理2000条记录。 当我的客户端使用相同的xml调用它时,它处理1000条记录。 它处理所有其他记录。

有没有人有这种问题的经验? 我的想法是它是一个编码问题,但我已经尝试在我的测试中将数据作为ASCII,ISO-8859-1等发送到服务,并且无法重新创建。

任何帮助都非常感激。

这是主叫代码:

while (userXml.Read())
{

    if (userXml.Name == NODE_NAME_FILE_NAME && userXml.NodeType == XmlNodeType.Element)
    {
        _importFilename = userXml.ReadString();
    }

    if (userXml.Name == NODE_NAME_USER && userXml.NodeType == XmlNodeType.Element)
    {
        ProcessUser(userXml);
    }
}

这就是processUser用teh xml reader做的事情

private void ProcessUser(XmlReader userXml)
{
    _usersinfeed++;
    XmlDocument user = new XmlDocument();
    user.LoadXml(userXml.ReadOuterXml());
     ...

}

1 个答案:

答案 0 :(得分:1)

你咬你的是ReadOuterXml的副作用 - 它很可能推进XmlReader的当前位置 - 但是,在你的循环while (userXml.Read())中你再次推进它 - 跳过一个xml元素这个过程。

有各种方法可以解决这个问题 - 但最简单和最干净的方法是不使用XmlReader。这是一个选择吗?

处理xml的一种更简单的方法是Linq to Xml:

public static void Main()
{
    SyncUserData(@"
    <doc>
    <filename>test</filename>
    <user>Someone</user>
    <user>Someone2</user>

    <filename>testA</filename>
    <user>Someone else</user>
    <user>Someone else2</user>
    </doc>
    ");
}

const string  NODE_NAME_FILE_NAME = "filename";
const string  NODE_NAME_USER = "user";

static string _importFilename;
static int _usersinfeed;

public static bool SyncUserData(string userxml) {
    foreach(XElement el in XDocument.Parse(userxml).Descendants()) {
        //or: XDocument.Parse(userxml).Root.Elements() -- this depends on your document

        if (el.Name == NODE_NAME_FILE_NAME)
            _importFilename = el.Value;
        if (el.Name == NODE_NAME_USER)
            ProcessUser(el);
    }
    return true;
}

private static void ProcessUser(XElement el)
{
    _usersinfeed++;
    Console.WriteLine("User:{0}, file:{1}\n{2}\n",_usersinfeed,_importFilename,el);
    //you probably don't need the following anymore
    //XmlDocument user = new XmlDocument();
    //user.LoadXml(el.CreateReader());

    //...
}

哪个输出:

User:1, file:test
<user>Someone</user>

User:2, file:test
<user>Someone2</user>

User:3, file:testA
<user>Someone else</user>

User:4, file:testA
<user>Someone else2</user>

但是,您可以使用XML序列化 - 这是一种非常简单的解析/生成XML的方法,而且没有太多样板文件也可以为您提供.NET本机数据结构来启动!然后,您只需要一小组类来定义文档结构,并且框架可以为您自动地从XML创建实例,而无需任何手动解析代码。但是,并非所有XML语法都适用于此。