QB .NET SDK对接QB Desktop带序列号ItemReceipt解析错误求助
排查QB .NET SDK创建带序列号ItemReceipt的XML解析错误
以下是针对问题的具体排查步骤和解决方案:
1. 核对QBXML中序列号节点的结构规范
QB Desktop对ItemReceipt的序列号节点层级和格式有严格要求,错误的节点位置或结构会直接触发XML解析错误。正确的序列号节点结构必须嵌套在InventoryLineDetail -> SerialOrLotNumbers下,每个序列号对应一个SerialOrLotNumber节点,示例如下:
<ItemReceiptLineAdd> <ItemRef> <FullName>你的库存商品名称</FullName> </ItemRef> <Quantity>1</Quantity> <InventoryLineDetail> <SerialOrLotNumbers> <SerialOrLotNumber> <SerialNumberValue>SERIAL-001</SerialNumberValue> <Quantity>1</Quantity> </SerialOrLotNumber> </SerialOrLotNumbers> </InventoryLineDetail> </ItemReceiptLineAdd>
检查你生成的QBXML是否符合上述结构:
- 确认
SerialOrLotNumbers节点存在且包裹所有序列号项 - 每个
SerialOrLotNumber节点必须包含SerialNumberValue和对应Quantity(即使数量为1) - 节点顺序必须严格遵循QBXML Schema要求(比如
InventoryLineDetail必须在Quantity之后)
2. 检查C#代码中序列号的构建逻辑
确保你在代码中正确初始化了序列号相关的对象,不要遗漏必要的层级:
// 构建ItemReceipt行项 var lineAdd = new ItemReceiptLineAdd { ItemRef = new ReferenceType { FullName = "你的库存商品" }, Quantity = 1 }; // 初始化库存明细及序列号集合 var inventoryDetail = new InventoryLineDetail(); var serialNumberSet = new SerialOrLotNumbers(); var serialItem = new SerialOrLotNumber { SerialNumberValue = "SERIAL-001", Quantity = 1 }; serialNumberSet.SerialOrLotNumberList.Add(serialItem); inventoryDetail.SerialOrLotNumbers = serialNumberSet; lineAdd.InventoryLineDetail = inventoryDetail;
常见错误点:
- 直接在
InventoryLineDetail下添加SerialNumberValue(跳过SerialOrLotNumbers和SerialOrLotNumber层级) - 未设置
SerialOrLotNumber的Quantity属性 - 序列号包含XML特殊字符(如
&、<、>)未转义,需要手动替换为&、<、>(部分SDK版本不会自动处理)
3. 验证QBXML的合法性
使用QB SDK自带的QBXML Validator工具(路径通常为C:\Program Files (x86)\Intuit\QuickBooks SDK 13.0\Tools\QBXMLValidator.exe),将生成的QBXML内容导入验证,工具会直接提示具体的解析错误位置(比如节点缺失、格式不符)。
4. 确认SDK与QB版本兼容性
确保你使用的QB .NET SDK版本与QB Enterprise版本匹配:
- 高版本QB(如2023+)可能要求使用QBXML v13.0或更高版本,旧SDK生成的低版本QBXML可能不兼容
- 检查项目中引用的QB SDK DLL版本,尝试升级到与当前QB版本对应的SDK版本
内容的提问来源于stack exchange,提问作者BitWiseByteDumb
相关产品推荐
相关产品推荐

