请耐心等待我,我对网络编程和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(抱歉帖子格式不好,不习惯在这里提问)