带有命名空间的xml解析,C#

前一段时间做花旗的接口,返回的xml格式是带有命名空间的,可是难倒了我,找了好久才找到解决办法,给大家分享下,少走弯路。

1,直接进入正题,先看一段带有命名空间的xml,这段xml大概的意思是,前面是header信息,后面是body中的信息,body中有不少的节点,主要的是

<ns6:RewardDetail>节点,这个节点包含了很多的<ns8:RedemptionDetails>节点,和一个<ns8:CurrentRewardStatementDetails>节点以及后续以ns8开头的节点。
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header>
    <ns0:RsHeader xmlns:ns0="http://www.citi.com/gcgi/shared/system/header">
      <ns0:DateAndTimeStamp>2014-05-29T02:17:07.634-04:00</ns0:DateAndTimeStamp>
      <ns0:UUID>55555461</ns0:UUID>
      <ns0:ESBUUID>8dc47a89-3e3b-4b17-a631-938b848447ed</ns0:ESBUUID>
      <ns0:ResponseCode>EC_6000_0</ns0:ResponseCode>
    </ns0:RsHeader>
  </SOAP-ENV:Header>
  <SOAP-ENV:Body>
    <ns6:RewardDetailInqRs xmlns:ns="http://www.citi.com/gcgi/services/common/addressandcontact/v5_5_0_0" xmlns:ns5="http://www.citi.com/gcgi_prov/services/cards/reward/v6_0_0_0" xmlns:ns6="http://www.citi.com/gcgi/services/cards/reward/v6_0_0_0" xmlns:pfx="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns7="http://www.citi.com/gcgi_prov/entities/cards/reward/v6_0_0_0" xmlns:ns8="http://www.citi.com/gcgi/entities/cards/reward/v6_0_0_0" xmlns:ns2="http://www.citi.com/gcgi/entities/common/customer/v5_9_0_0" xmlns:pd="http://xmlns.tibco.com/bw/process/2003" xmlns:ns1="http://www.citi.com/gcgi/services/common/addressandcontact/v6_0_0_0" xmlns:ns4="http://www.citi.com/gcgi/shared/system/systemtypes" xmlns:ns3="http://www.citi.com/gcgi/shared/system/header" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pfx2="http://www.citi.com/gcgi/entities/common/customer/v6_0_0_0">
      <ns6:Base>
        <ns3:RsHeader>
          <ns3:DateAndTimeStamp>2014-05-29T02:17:07.634-04:00</ns3:DateAndTimeStamp>
          <ns3:UUID>55555461</ns3:UUID>
          <ns3:ESBUUID>8dc47a89-3e3b-4b17-a631-938b848447ed</ns3:ESBUUID>
          <ns3:ResponseCode>EC_6000_0</ns3:ResponseCode>
        </ns3:RsHeader>
        <ns6:RewardDetail>
          <ns8:RedemptionDetails>
            <ns8:RedemptionNo>99798493499998</ns8:RedemptionNo>
            <ns8:RedemptionStatus>F</ns8:RedemptionStatus>
          <ns8:RedemptionDetails>
            <ns8:RedemptionNo>99798496299998</ns8:RedemptionNo>
            <ns8:RedemptionStatus>F</ns8:RedemptionStatus>
            <ns8:RedemptionMiniDetails>
              <ns8:RedemptionProgram>1</ns8:RedemptionProgram>
              <ns8:RedemptionBonusProgram>0</ns8:RedemptionBonusProgram>
              <ns8:RedemptionLevel>00006</ns8:RedemptionLevel>
              <ns8:RedemptionQuantity>99900</ns8:RedemptionQuantity>
            </ns8:RedemptionMiniDetails>
            <ns8:RedemptionPoints>9.9995E8</ns8:RedemptionPoints>
            <ns8:RedemptionAmount>0.0E0</ns8:RedemptionAmount>
            <ns8:RedemptionDescription>50 RMB CASH REBATE</ns8:RedemptionDescription>
            <ns8:CreatorId>RWBGBD08</ns8:CreatorId>
            <ns8:RedemptionDate>2015-02-06</ns8:RedemptionDate>
          </ns8:RedemptionDetails>
          <ns8:RedemptionDetails>
            <ns8:RedemptionNo>99798499299998</ns8:RedemptionNo>
            <ns8:RedemptionStatus>F</ns8:RedemptionStatus>
            <ns8:RedemptionMiniDetails>
              <ns8:RedemptionProgram>1</ns8:RedemptionProgram>
              <ns8:RedemptionBonusProgram>0</ns8:RedemptionBonusProgram>
              <ns8:RedemptionLevel>00006</ns8:RedemptionLevel>
              <ns8:RedemptionQuantity>2480</ns8:RedemptionQuantity>
            </ns8:RedemptionMiniDetails>
            <ns8:RedemptionPoints>1.24E6</ns8:RedemptionPoints>
            <ns8:RedemptionAmount>0.0E0</ns8:RedemptionAmount>
            <ns8:RedemptionDescription>50 RMB CASH REBATE</ns8:RedemptionDescription>
            <ns8:CreatorId>RWBGBD08</ns8:CreatorId>
            <ns8:RedemptionDate>2015-01-07</ns8:RedemptionDate>
          </ns8:RedemptionDetails>
          <ns8:CurrentRewardStatementDetails>
            <ns8:Sales>0.0E0</ns8:Sales>
            <ns8:Beginning>9.80000008E10</ns8:Beginning>
            <ns8:Earned>0.0E0</ns8:Earned>
            <ns8:Bonus>0.0E0</ns8:Bonus>
            <ns8:Adjusted>0.0E0</ns8:Adjusted>
            <ns8:Redeemed>1.914E5</ns8:Redeemed>
            <ns8:Available>9.79998094E10</ns8:Available>
          </ns8:CurrentRewardStatementDetails>
          <ns8:EnrolProgram>1</ns8:EnrolProgram>
          <ns8:Description>YUPPIES</ns8:Description>
          <ns8:EnrolmentIndicator>Y</ns8:EnrolmentIndicator>
          <ns8:FlagTime>00:00:00</ns8:FlagTime>
          <ns8:MembershipStatus>A</ns8:MembershipStatus>
        </ns6:RewardDetail>
      </ns6:Base>
    </ns6:RewardDetailInqRs>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

2,这一步我们,要开始解析xml,当然准备工作也是要做的,命名空间一定要引用using System.Xml,怎么处理命名空间这一步也将处理。

实例化一个xml命名空间管理器,然后将不同的命名空间加入管理器中,这些命名空间我们从哪里找呢?很显然我们要从xml文档中把他们找出来

xml文档中只要是带有这种 (xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/")的都是命名空间,要把解析时候要用的

命名空间加入命名空间管理器。

XmlDocument doc = new XmlDocument();
doc.LoadXml(“xml字符串”);
XmlNamespaceManager nsMgr = new XmlNamespaceManager(doc.NameTable);//这一步实例化一个xml命名空间管理器
nsMgr.AddNamespace("SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/");
nsMgr.AddNamespace("ns", "http://www.citi.com/gcgi/services/common/addressandcontact/v5_5_0_0");
nsMgr.AddNamespace("ns0", "http://www.citi.com/gcgi/shared/system/header");
nsMgr.AddNamespace("ns1", "http://www.citi.com/gcgi/services/common/addressandcontact/v6_0_0_0");
nsMgr.AddNamespace("ns2", "http://www.citi.com/gcgi/entities/common/customer/v5_9_0_0");
nsMgr.AddNamespace("ns3", "http://www.citi.com/gcgi/shared/system/header");
nsMgr.AddNamespace("ns4", "http://www.citi.com/gcgi/shared/system/systemtypes");
nsMgr.AddNamespace("ns5", "http://www.citi.com/gcgi_prov/services/cards/reward/v6_0_0_0");
nsMgr.AddNamespace("ns6", "http://www.citi.com/gcgi/services/cards/reward/v6_0_0_0");
nsMgr.AddNamespace("ns7", "http://www.citi.com/gcgi_prov/entities/cards/reward/v6_0_0_0");
nsMgr.AddNamespace("ns8", "http://www.citi.com/gcgi/entities/cards/reward/v6_0_0_0");

3,为了接收xml中的值,我新建了一个类

public class RedemptionDetails
{
    public string RedemptionNo { get; set; }
    public string RedemptionStatus { get; set; }
    public string RedemptionPoints { get; set; }
    public string RedemptionAmount { get; set; }
    public string RedemptionDescription { get; set; }
    public string CreatorId { get; set; }
    public string RedemptionDate { get; set; }
    public string RedemptionProgram { get; set; }
    public string RedemptionBonusProgram { get; set; }
    public string RedemptionLevel { get; set; }
    public string RedemptionQuantity { get; set; }
}

4,下面的代码是我具体的实现解析到我需要的具体值,这些也不做过多的解释,直接上代码

                    XmlNode ss = doc.SelectSingleNode("SOAP-ENV:Envelope/SOAP-ENV:Body/ns6:RewardDetailInqRs/ns6:Base", nsMgr);
                    if (ss != null)
                    {
                        XmlNode code = ss.SelectSingleNode("ns3:RsHeader/ns3:ResponseCode", nsMgr);
                        detail.ResponseCode = code.InnerText.Split(‘_‘)[2] == "0" ? "0000" : code.InnerText.Split(‘_‘)[2]; ;

                        XmlNode current = ss.SelectSingleNode("ns6:RewardDetail", nsMgr).SelectSingleNode("ns8:CurrentRewardStatementDetails", nsMgr);
                        string Avaliable = current.SelectSingleNode("ns8:Available", nsMgr).InnerText;
                        detail.Available = ConvertToPoint(Avaliable);
                        string Redeemed = current.SelectSingleNode("ns8:Redeemed", nsMgr).InnerText;
                        detail.Redeemed = ConvertToPoint(Redeemed);
                        XmlNodeList RedemptionDetailsList = ss.SelectSingleNode("ns6:RewardDetail", nsMgr).SelectNodes("ns8:RedemptionDetails", nsMgr);
                        List<RedemptionDetails> ListDetail = new List<RedemptionDetails>();
                        for (int i = 0; i < RedemptionDetailsList.Count; i++)
                        {
                            RedemptionDetails redemptionDetails = new RedemptionDetails();
                            redemptionDetails.RedemptionNo = RedemptionDetailsList[i].SelectSingleNode("ns8:RedemptionNo", nsMgr).InnerText;
                            if (RedemptionDetailsList[i].SelectSingleNode("ns8:RedemptionStatus", nsMgr) != null)
                            {
                                redemptionDetails.RedemptionStatus = RedemptionDetailsList[i].SelectSingleNode("ns8:RedemptionStatus", nsMgr).InnerText;
                            }
                            else
                            {
                                redemptionDetails.RedemptionStatus = "";
                            }
                            string RedemptionPoints = RedemptionDetailsList[i].SelectSingleNode("ns8:RedemptionPoints", nsMgr).InnerText;
                            redemptionDetails.RedemptionPoints = ConvertToPoint(RedemptionPoints);
                            string RedemptionAmount = RedemptionDetailsList[i].SelectSingleNode("ns8:RedemptionAmount", nsMgr).InnerText;
                            redemptionDetails.RedemptionAmount =ConvertToPoint(RedemptionAmount);
                            redemptionDetails.RedemptionDescription = RedemptionDetailsList[i].SelectSingleNode("ns8:RedemptionDescription", nsMgr).InnerText;
                            redemptionDetails.CreatorId = RedemptionDetailsList[i].SelectSingleNode("ns8:CreatorId", nsMgr).InnerText;
                            redemptionDetails.RedemptionDate = RedemptionDetailsList[i].SelectSingleNode("ns8:RedemptionDate", nsMgr).InnerText;
                            redemptionDetails.RedemptionProgram = RedemptionDetailsList[i].SelectSingleNode("ns8:RedemptionMiniDetails/ns8:RedemptionProgram", nsMgr).InnerText;
                            redemptionDetails.RedemptionBonusProgram = RedemptionDetailsList[i].SelectSingleNode("ns8:RedemptionMiniDetails/ns8:RedemptionBonusProgram", nsMgr).InnerText;
                            redemptionDetails.RedemptionLevel = RedemptionDetailsList[i].SelectSingleNode("ns8:RedemptionMiniDetails/ns8:RedemptionLevel", nsMgr).InnerText;
                            redemptionDetails.RedemptionQuantity = RedemptionDetailsList[i].SelectSingleNode("ns8:RedemptionMiniDetails/ns8:RedemptionQuantity", nsMgr).InnerText;
                            ListDetail.Add(redemptionDetails);
                        }
                        detail.ListDetail = ListDetail;
                    }

5,本例子到此结束,没有什么高深的东西,很简单的东西可能之前没用过而已,希望对大家有所帮助,这也是我现实中遇到的问题,和大家分享下。

[email protected]

时间: 2024-11-08 23:51:45

带有命名空间的xml解析,C#的相关文章

c#读取带有命名空间的XML

XML文件内容 <?xml version="1.0" standalone="no"?> <svg width="1709px" height="886px" onload="init(evt)" viewBox="0 0 1800 900" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="

php解析带有命名空间的xml

xml如果带有命名空间我们将如何解析,例如: <ns1:CreateBillResponse xmlns:ns1="http://neusoft.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSc

XML的命名空间与python解析方法

在 XML 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突,而XML 命名空间提供避免元素命名冲突的方法. XML 命名空间属性被放置于元素的开始标签之中,并使用以下的语法: xmlns:namespace-prefix="namespaceURI" 当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联. 注释:用于标示命名空间的地址不会被解析器用于查找信息.其惟一的作用是赋予命名空间一个惟一的名称. 除了显式定义

使用XPath查询带有命名空间(有xmlns)的XML(转)

使用XPath查询带有命名空间(有xmlns)的XML 标签: xmlsilverlightwebserviceencodingwpfinclude 2012-06-19 10:26 3235人阅读 评论(0) 收藏 举报  分类: XML(7)  最近碰到一个小问题,通过调用webservice返回如下的xml, <Seller xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http:

linq 解析 带命名空间的xml

前言:xml的操作方式有多种,但要论使用频繁程度,博主用得最多的还是Linq to xml的方式,觉得它使用起来很方便,就用那么几个方法就能完成简单xml的读写.之前做的一个项目有一个很变态的需求:C#项目调用不知道是什么语言写的一个WebService,然后添加服务引用总是失败,通过代理的方式动态调用也总是报错,最后没办法,通过发送原始的WebRequest请求直接得到对方返回的一个xml文件.注意过webservice的wsdl文件的朋友应该知道这个是系统生成的xml文件,有点复杂,研究了半

利用XPath解析带有xmlns的XML文件

在.net中,编写读取xml 的程序中提示"未将对象引用设置到对象的实例",当时一看觉得有点奇怪.为什么在读取xml数据的时候也要实例化一个对象.google了才知道,xml文件中加入了xmlns表示名称空间,但同时Xpath也必须加上. 如之前我们的xml文件定义为: <Project Name="目标计划项目"> <Process Name="个人月度计划" Description="个人月度计划" Ve

C# 解析带命名空间的xml

xml <?xml version="1.0" encoding="utf-8"?> <string xmlns="http://tempuri.org/">发票代码:012001800311 发票号码:24961816 开票日期:2019-04-02 购方企业名称:购方纳税号:913101140781x22VV1 销方企业名称:清出公司 销方纳税号:911201163409833307 价税合计:4 金额:94.76 税

Java数据库编程、Java与XML解析技术

Java数据库编程: 1. JDBC概述:JDBC(数据库连接)是Java中提供的一套数据库编程API,它定义了一套用来访问数据库的标准Java类库(位于java.sql和javax.sql包中).用JDBC开发的数据库  应用既可以跨操作系统平台,又可以跨数据库系统平台.    在JDBC的基本操作中,最常用的类和接口包括DriverManager,  Connection,  Statement,  PreparedStatement,  CallableStatement 和 Result

mybatis之XML解析源码分析

一直想知道mybatis是如何解析xml文件的,今天认真看了下源码,这里记录一下 这里是用mybatis-spring的SqlSessionFactoryBean当作的入口,mybatis-spring其实很简单,源码也就几个看看就懂了,代理了一下而已没啥东东. 1.解析spring的配置 不过很多参数都是spring中来处理了,所以mybatis-spring没有先parse而是先加载了配置文件 依次是 typeAliasesPackage typeAliases Plugins typeHa