我有一个有一种方法的网络服务:
[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());
...
}
答案 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语法都适用于此。