xsd.exe生成XML未正确嵌套问题求助(XML入门阶段)
解决XML序列化时元素未正确嵌套的问题
我之前处理过类似的XML序列化嵌套问题,结合你的情况,给你几个实用的排查和解决步骤:
1. 检查生成的实体类层级关系是否正确
用xsd.exe生成实体类后,一定要确认类之间的包含关系和你的XSD结构完全匹配:
- 顶层的
communication类应该包含一个transaction类型的属性(对应XSD里的<transaction>元素) transaction类应该包含一个List<Inspection>类型的属性(因为XSD里<Inspection>是maxOccurs="unbounded")Inspection类必须包含Wh和Inspect类型的属性,对应XSD里的嵌套元素
如果生成的类里这些引用关系缺失(比如每个元素都是独立的类,没有互相包含),那序列化时自然不会生成嵌套结构。你可以重新执行xsd.exe your_schema.xsd /classes命令生成类,然后打开.cs文件逐一核对层级。
2. 务必从顶层对象开始序列化,不要单独序列化子对象
这是最容易犯的错误:很多人会分别序列化communication、transaction等对象,导致每个元素都成为独立的根节点。正确的做法是先把整个嵌套结构的对象组装完成,再序列化最顶层的communication对象。
举个完整的示例代码:
// 1. 构建最内层的Wh对象 var whInfo = new Wh { Name = "Warehouse A", City = "Chicago", State = "IL", Zip = 60601, Country = "USA" }; // 2. 构建Inspect对象 var inspectInfo = new Inspect { Examined = 5, Infested = 0, Signature = "John Doe", SignatureDate = DateTime.Now, InspectedDateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), Finding = "" }; // 3. 构建Inspection对象并关联内层对象 var inspectionItem = new Inspection { Tracking = 1001, Wh = whInfo, Inspect = inspectInfo }; // 4. 构建Transaction对象并添加Inspection集合 var transactionObj = new transaction { Inspection = new List<Inspection> { inspectionItem } }; // 5. 构建顶层Communication对象并关联Transaction var commObj = new communication { transaction = transactionObj, transactionType = 1, holder = "Test Holder", user = "admin", password = "xxxx", sequence = 1, type = 2, date = (uint)DateTime.Now.Year * 10000 + (uint)DateTime.Now.Month * 100 + (uint)DateTime.Now.Day, time = (uint)DateTime.Now.Hour * 10000 + (uint)DateTime.Now.Minute * 100 + (uint)DateTime.Now.Second, // 注意这里还有communication本身的date、time、version、vendor属性,别遗漏 date1 = (uint)DateTime.Now.Year * 10000 + (uint)DateTime.Now.Month * 100 + (uint)DateTime.Now.Day, time1 = (uint)DateTime.Now.Hour * 10000 + (uint)DateTime.Now.Minute * 100 + (uint)DateTime.Now.Second, version = 1, vendor = "MyVendor" }; // 6. 序列化顶层对象到XML文件 var serializer = new XmlSerializer(typeof(communication)); using (var writer = new StreamWriter("output.xml")) { serializer.Serialize(writer, commObj); }
3. 检查实体类的XML序列化特性是否正确
有时候xsd.exe生成的特性可能有问题,比如子类被错误标记了[XmlRoot]而不是[XmlElement]。比如transaction类上应该是[XmlElement("transaction")](作为communication的子元素),而不是[XmlRoot("transaction")](作为根元素)。
如果发现特性错误,可以手动修改实体类的XML特性,确保每个嵌套元素的特性都符合层级要求。
4. 验证序列化结果的正确性
运行代码后,打开生成的output.xml,检查结构是否符合预期。如果还是有问题,可以把生成的实体类代码片段贴出来,进一步排查层级关系是否有误。
内容的提问来源于stack exchange,提问作者Johnathan
相关产品推荐
相关产品推荐

