2010-06-18 110 views
1

我有有一个方法Web服务半数据:的XmlReader跳过发送到web服务

[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确实与德XML阅读器

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

}

回答

1

什么咬你是ReadOuterXml副作用 - 它很可能会提高XmlReader的当前位置 - 但是,然后在您的循环while (userXml.Read())中再次提前 - 跳过proc中的一个xml元素ESS。

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

更简单的方法来处理XML是LINQ到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语法都适用于此。

+0

感谢您的支持。这是代码的正确问题。为什么它在dev和not production中工作的原因是dev xml中存在的空白节点在生产xml中不存在。这意味着额外的读取没有超出预期的节点 – sentece 2010-06-28 15:43:23

+0

您最终会使用哪种方法?你有没有尝试Xml序列化?真的,你应该看一看 - 比手写这些东西容易得多。 – 2010-06-28 16:57:38

+0

我没有'实际上,只是修复了XmlReader - xml直接去了db,我们没有导入的反向序列化的域对象。 我们也使用.net 2所以没有linq 我已经使用过xml序列化和喜欢它。 感谢您的全力帮助 – sentece 2010-09-02 14:52:42