关于.NET 解析 XML 的问题

MrTanghb 2015-09-07 05:59:07
公司业务,需要和其他公司对接,需要解析XMl,将XMl字符转换成实体类

XML结构如下
<?xml version="1.0" encoding="UTF-8"?>
<ap>
<plain>
<resp_code>0000</resp_code>
<mchnt_cd>0002900F0040281</mchnt_cd>
<mchnt_txn_ssn>A000000000002</mchnt_txn_ssn>
<opResultSet>
<opResult>
<user_id>13900000000</user_id>
<ct_balance>期初账面总余额</ct_balance>
<ca_balance>期初可用总余额</ca_balance>
<cu_balance>期初未转结总余额</cu_balance>
<cf_balance>期初冻结总余额</cf_balance>
<details>
<detail>
<transSsn>交易流水号</transSsn>
<rec_crt_ts>记账时间点 ,比如:'2012-08-24 11:29:13.220387'</rec_crt_ts>
<ct_debit_amt>账面余额出账金额</ct_debit_amt>
<ct_credit_amt>账面余额入账金额</ct_credit_amt>
<ca_debit_amt>可用余额出账金额</ca_debit_amt>
<ca_credit_amt>可用余额入账金额</ca_credit_amt>
<cu_debit_amt>未转结余额出账金额</cu_debit_amt>
<cu_credit_amt>未转结余额入账金额</cu_credit_amt>
<cf_debit_amt>冻结余额出账金额</cf_debit_amt>
<cf_credit_amt>冻结余额入账金额</cf_credit_amt>
<ct_balance>账面余额</ct_balance>
<ca_balance>可用余额</ca_balance>
<cu_balance>未转接余额</cu_balance>
<cf_balance>冻结余额</cf_balance>
<book_digest>摘要信息</book_digest>
</detail>
<detail>

</detail>

</details>
</opResult>
</opResultSet>
</plain>
<signature>签名数据</signature>
</ap>


百度了好多中方法都不能,麻烦各位大神帮忙看看,在线等 急,
...全文
200 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
myhope88 2015-09-10
  • 打赏
  • 举报
回复
用linq不是挺好用的嘛
不烈鸟 2015-09-09
  • 打赏
  • 举报
回复
看到楼上的回复 正好学习了
showjim 2015-09-09
  • 打赏
  • 举报
回复
试试fastCSharp
        class ap
        {
            public string signature;
            public plain plain;
        }
        class plain
        {
            public string resp_code;
            public string mchnt_cd;
            public string mchnt_txn_ssn;
            [fastCSharp.emit.xmlSerialize.member(ItemName = "opResult")]
            public opResult[] opResultSet;
        }
        class opResult
        {
            public string user_id;
            public string ct_balance;
            public string ca_balance;
            public string cu_balance;
            public string cf_balance;
            [fastCSharp.emit.xmlSerialize.member(ItemName = "detail")]
            public detail[] details;
        }
        class detail
        {
            public string transSsn;
            public string rec_crt_ts;
            public string ct_debit_amt;
            public string ct_credit_amt;
            public string ca_debit_amt;
            public string ca_credit_amt;
            public string cu_debit_amt;
            public string cu_credit_amt;
            public string cf_debit_amt;
            public string cf_credit_amt;
            public string ct_balance;
            public string ca_balance;
            public string cu_balance;
            public string cf_balance;
            public string book_digest;
        }
        static unsafe void Main(string[] args)
        {
            string xml = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<ap>
<plain>
<resp_code>0000</resp_code>
<mchnt_cd>0002900F0040281</mchnt_cd>
<mchnt_txn_ssn>A000000000002</mchnt_txn_ssn>
<opResultSet>
<opResult>
<user_id>13900000000</user_id>
<ct_balance>期初账面总余额</ct_balance>
<ca_balance>期初可用总余额</ca_balance>
<cu_balance>期初未转结总余额</cu_balance>
<cf_balance>期初冻结总余额</cf_balance>
<details>
    <detail>
        <transSsn>交易流水号</transSsn>
        <rec_crt_ts>记账时间点 ,比如:'2012-08-24 11:29:13.220387'</rec_crt_ts>
        <ct_debit_amt>账面余额出账金额</ct_debit_amt>
        <ct_credit_amt>账面余额入账金额</ct_credit_amt>
        <ca_debit_amt>可用余额出账金额</ca_debit_amt>
        <ca_credit_amt>可用余额入账金额</ca_credit_amt>
        <cu_debit_amt>未转结余额出账金额</cu_debit_amt>
        <cu_credit_amt>未转结余额入账金额</cu_credit_amt>
        <cf_debit_amt>冻结余额出账金额</cf_debit_amt>
        <cf_credit_amt>冻结余额入账金额</cf_credit_amt>
        <ct_balance>账面余额</ct_balance>
<ca_balance>可用余额</ca_balance>
<cu_balance>未转接余额</cu_balance>
<cf_balance>冻结余额</cf_balance>
        <book_digest>摘要信息</book_digest>
    </detail>
    <detail>
    </detail>
</details>
</opResult>
</opResultSet>
</plain>
<signature>签名数据</signature>
</ap>";
            ap value = fastCSharp.emit.xmlParser.Parse<ap>(xml, new fastCSharp.emit.xmlParser.config { BootNodeName = "ap" });
            Console.WriteLine(value.signature);
            string xml1 = value.ToXml(new fastCSharp.emit.xmlSerializer.config { BootNodeName = "ap" });
            Console.WriteLine(xml1);
            Console.ReadKey();
        }
showjim 2015-09-09
  • 打赏
  • 举报
回复
试试fastCSharp
        class ap
        {
            public string signature;
            public plain plain;
        }
        class plain
        {
            public string resp_code;
            public string mchnt_cd;
            public string mchnt_txn_ssn;
            [fastCSharp.emit.xmlSerialize.member(ItemName = "opResult")]
            public opResult[] opResultSet;
        }
        class opResult
        {
            public string user_id;
            public string ct_balance;
            public string ca_balance;
            public string cu_balance;
            public string cf_balance;
            [fastCSharp.emit.xmlSerialize.member(ItemName = "detail")]
            public detail[] details;
        }
        class detail
        {
            public string transSsn;
            public string rec_crt_ts;
            public string ct_debit_amt;
            public string ct_credit_amt;
            public string ca_debit_amt;
            public string ca_credit_amt;
            public string cu_debit_amt;
            public string cu_credit_amt;
            public string cf_debit_amt;
            public string cf_credit_amt;
            public string ct_balance;
            public string ca_balance;
            public string cu_balance;
            public string cf_balance;
            public string book_digest;
        }
        static unsafe void Main(string[] args)
        {
            string xml = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<ap>
<plain>
<resp_code>0000</resp_code>
<mchnt_cd>0002900F0040281</mchnt_cd>
<mchnt_txn_ssn>A000000000002</mchnt_txn_ssn>
<opResultSet>
<opResult>
<user_id>13900000000</user_id>
<ct_balance>期初账面总余额</ct_balance>
<ca_balance>期初可用总余额</ca_balance>
<cu_balance>期初未转结总余额</cu_balance>
<cf_balance>期初冻结总余额</cf_balance>
<details>
    <detail>
        <transSsn>交易流水号</transSsn>
        <rec_crt_ts>记账时间点 ,比如:'2012-08-24 11:29:13.220387'</rec_crt_ts>
        <ct_debit_amt>账面余额出账金额</ct_debit_amt>
        <ct_credit_amt>账面余额入账金额</ct_credit_amt>
        <ca_debit_amt>可用余额出账金额</ca_debit_amt>
        <ca_credit_amt>可用余额入账金额</ca_credit_amt>
        <cu_debit_amt>未转结余额出账金额</cu_debit_amt>
        <cu_credit_amt>未转结余额入账金额</cu_credit_amt>
        <cf_debit_amt>冻结余额出账金额</cf_debit_amt>
        <cf_credit_amt>冻结余额入账金额</cf_credit_amt>
        <ct_balance>账面余额</ct_balance>
<ca_balance>可用余额</ca_balance>
<cu_balance>未转接余额</cu_balance>
<cf_balance>冻结余额</cf_balance>
        <book_digest>摘要信息</book_digest>
    </detail>
    <detail>
    </detail>
</details>
</opResult>
</opResultSet>
</plain>
<signature>签名数据</signature>
</ap>";
            ap value = fastCSharp.emit.xmlParser.Parse<ap>(xml, new fastCSharp.emit.xmlParser.config { BootNodeName = "ap" });
            Console.WriteLine(value.signature);
            string xml1 = value.ToXml(new fastCSharp.emit.xmlSerializer.config { BootNodeName = "ap" });
            Console.WriteLine(xml1);
            Console.ReadKey();
        }
MrchenAND 2015-09-08
  • 打赏
  • 举报
回复
XElement.Parse(xml),慢慢取节点即可
江南小鱼 2015-09-08
  • 打赏
  • 举报
回复
目测是标准的xml,参考C#解析XML
  • 打赏
  • 举报
回复
LinqToXML看起来没啥难的,很标准的xml,连namespace都没有 也可以定义对应的实体,然后反序列化

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧