删除SOAP信封后格式化xml字符串时出现问题

时间:2013-07-15 14:58:32

标签: c# xml asp.net-mvc-4 linq-to-xml xml-formatting

请耐心等待我,我对网络编程和XML非常陌生。

我正在创建一个MVC 4应用程序,它基本上从外部数据库中提取信息并将其显示在表格中,以比较发送给保险评级的XML文件。我很好地展示了表格,但XML看起来很粗糙,所以我想以更好的方式对其进行格式化。它周围有一个庞大的SOAP信封,所以我删除了它,但我提取的XML字符串是一个loooong行,我似乎无法破解和格式化互联网建议的方式。

以下是我在SOAP信封中的XML示例(已编辑):

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:iaax="http://www.ibm.com/ima/iaa/IAAXML" xmlns:soap="soap" xmlns:ext="urn:BLAH">
  <soapenv:Header>
    <wsse:Security soap:mustUnderstand="1" xmlns:wsse="http://docs...">
      <wsse:UsernameToken wsu:Id="UsernameToken-9999999" xmlns:wsu="http://docs...">
        <wsse:Username>{0}</wsse:Username>
        <wsse:Password Type="http://docs.......">{1}</wsse:Password>
        <wsse:Nonce>#########==</wsse:Nonce>
        <wsu:Created>2009-10-14T16:22:08.102Z</wsu:Created>
      </wsse:UsernameToken>
    </wsse:Security>
  </soapenv:Header>
  <soapenv:Body>
    <iaax:GenericProxyService>
      <requestHeader>
        <iaax:id>_PNUMDA</iaax:id>
        <iaax:cmdType>request</iaax:cmdType>
        <iaax:cmdMode>alwaysRespond</iaax:cmdMode>
        <iaax:echoBack>false</iaax:echoBack>
        <iaax:serviceContext>
          <keepAlive>false</keepAlive>
          <channelName>DSPR</channelName>
          <vendorId />
          <debug>false</debug>
          <trace>false</trace>
        </iaax:serviceContext>
      </requestHeader>
      <targetAction>calculate</targetAction>
      <marketableProduct>FOO</marketableProduct>
      <requestData><![CDATA[<tns:CalculateASDF xmlns:tns="http://www.blah.com"><calculate><policy></policy><policyNumber>2</policyNumber><agentId>AA1000</agentId><marketableProduct>Home</marketableProduct><items><item><state>PA</state><unitType>Dwelling</unitType></item></items></calculate></tns:CalculateASDF>]]></requestData>
    </iaax:GenericProxyService>
  </soapenv:Body>
</soapenv:Envelope>

要把它拿出来我做了这个:

{
  ....
    List<Service> list = session.Service.ToList();
                List<Service> searchlist = new List<Service>();
                searchlist.AddRange(
                    list.Where(
                        x =>
                        x.ServiceId.Equals(srrId1) ||
                        x.ServiceId.Equals(srrId2)));

    foreach (var s in searchlist)
    {
      XDocument doc = XDocument.Parse(s.XMLText);

          foreach (XElement e in doc.Descendants("requestData"))
          {
             string newxml = (string)e;

             service.XMLText = newxml;
          }
    }
    return View(searchlist.DefaultIfEmpty());
}

这就是我的XML现在在屏幕上的显示方式(已编辑):

 <tns:CalculateASDF xmlns:tns="http://www.blah.com"><calculate><policy></policy><policyNumber>2</policyNumber><agentId>AA1000</agentId><marketableProduct>Home</marketableProduct><items><item><state>PA</state><unitType>Dwelling</unitType></item></items></calculate></tns:CalculateASDF>

......然而它只是在一条长长的绳子上伸展着我的桌子。

我试图在this帖子之后打破元素,但它不起作用......

foreach (var s in searchlist)
{
    XDocument doc = XDocument.Parse(s.XMLText);

    var dict =
                doc.Element("calculate")
                   .Elements()
                   .ToDictionary(x => x.Name.LocalName, x => x.Value);

    string policynum = dict["policyNumber"];
    s.XMLText = policynum;
}

我在实施解决方案时遇到了类似的错误,我试图使用内部标记,但它不起作用。但是尝试使用CalculateASDF也不起作用......他们都抛出了这个例外:

  

对象引用未设置为对象的实例。

     

描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

     

异常详细信息:System.NullReferenceException:未将对象引用设置为对象的实例。

我认为由于CalculateASDF

,认为tns:不起作用

所以......这就是我所处的位置。对不起,这构建得很糟糕,我正在学习。有关如何将XML分解为可读xml或获取XML并存储和显示我的变量的任何帮助,如:

修改

 * PolicyNumber: 2
 * AgentId: zz1234
 * MarketableProduct: Home
 * State: PA
 * UnitType: Dwelling

非常感谢。最后,在我正确显示XML之后,我将尝试创建一个diff工具,让它只显示评级之间的变化。我将不胜感激任何建设性的意见。如果有任何需要澄清的话,请告诉我。

PS(抱歉帖子格式不好,不习惯在这里提问)

0 个答案:

没有答案