我是L2
XML的新手,并不是
XML的专家,因此我遇到一点麻烦并不奇怪.在我的第一步中,我声明了一个相对简单的XDocument对象来创建XML方法结果.
以下是预期XML的示例.
<?xml version="1.0" encoding="UTF-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <soap:Body> <TXLife xmlns="http://ACORD.org/Standards/Life/2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ACORD.org/Standards/Life/2 TXLife2.28enum.XSD"> <UserAuthResponse> <TransResult> <ResultCode tc="1">Success</ResultCode> </TransResult> <SvrDate>2010-12-02</SvrDate> <SvrTime>14:40:50-06:00</SvrTime> </UserAuthResponse> <TXLifeResponse> <TransRefGUID>V7504892456123812</TransRefGUID> <TransType tc="121">General Requirement Order Request</TransType> <TransExeDate>2010-12-02</TransExeDate> <TransExeTime>14:40:50-06:00</TransExeTime> <TransMode tc="2">Original</TransMode> <TestIndicator tc="1">Yes</TestIndicator> <TransResult> <ResultCode tc="1">Success</ResultCode> </TransResult> <OLifE> <SourceInfo> <CreationDate>2010-12-02</CreationDate> <CreationTime>14:40:50-06:00</CreationTime> <SourceInfoName>External vendor Name</SourceInfoName> </SourceInfo> </OLifE> </TXLifeResponse> </TXLife> </soap:Body> </soap:Envelope>
public string SubmitOrder121(string xmlIn) { string resultText = "SUCCESS"; //Hard coded for Now. Needs to be set based on result of call to CrossBow. string resultCode = "1"; //Same comment as above. string date = DateTime.Today.ToShortDateString(); string time = DateTime.Now.ToShortTimeString(); string transRefGUID = "V7504892456123812"; //Hard coded for Now. Get from xmlIn; string transModeText = "Original"; //Don't kNow what this is for or where to get it if there are other possibilities string transModeCode = "2"; //Same as above comment string testIndicatorText = "True"; //Get from config file string testIndicatorCode = "1"; //Get from config file string companyName = "External vendor Name"; //Get from config file XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance"; XNamespace soap = "http://www.w3.org/2001/12/soap-envelope"; XNamespace xmlns = "http://ACORD.org/Standards/Life/2"; XDocument xdoc = new XDocument( new XDeclaration("1.0","utf-8",""),new XElement(soap + "Envelope",new XAttribute(XNamespace.Xmlns + "wsu","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"),new XAttribute(XNamespace.Xmlns + "wsa","http://schemas.xmlsoap.org/ws/2004/03/addressing"),new XAttribute(XNamespace.Xmlns + "wsse","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"),new XAttribute(XNamespace.Xmlns + "soap","http://schemas.xmlsoap.org/soap/envelope/"),new XElement(soap + "Body",new XElement(xmlns + "TXLife",new XAttribute(xsi + "schemaLocation","http://ACORD.org/Standards"),new XAttribute(XNamespace.Xmlns + "xsi","http://www.w3.org/2001/XMLSchema-instance"),new XElement("UserAuthResponse",new XElement("TransResult",new XElement("ResultCode",resultText,new XAttribute("tc",resultCode) ) ),new XElement("SvrDate",date),new XElement("SvrTime",time) ),new XElement("TXLifeResponse",new XElement("TransRefGUID",transRefGUID),new XElement("TransType","General Requiremeent Order Request","121") ),new XElement("TransExeDate",//Get from crossbow result new XElement("TransExeTime",time),//Get from crossbow result new XElement("TransMode",transModeText,transModeCode) ),new XElement("TestIndicator",testIndicatorText,testIndicatorCode) ),new XElement("OLife",new XElement("SourceInfo",new XElement("CreationDate",new XElement("CreationTime",new XElement("SourceInfoName",companyName) ) ) ) ) ) ) ); return xdoc.ToString(); }
现在,鉴于到目前为止我能够理解的一点点,上面应该给我我想要的东西,但事实并非如此.它给了我这个:
<Envelope xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://www.w3.org/2001/12/soap-envelope"> <Body> <TXLife xsi:schemaLocation="http://ACORD.org/Standards" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://ACORD.org/Standards/Life/2"> <UserAuthResponse xmlns=""> <TransResult> <ResultCode tc="1">SUCCESS</ResultCode> </TransResult> <SvrDate>6/14/2013</SvrDate> <SvrTime>1:57 PM</SvrTime> </UserAuthResponse> <TXLifeResponse xmlns=""> <TransRefGUID>V7504892456123812</TransRefGUID> <TransType tc="121">General Requiremeent Order Request</TransType> <TransExeDate>6/14/2013</TransExeDate> <TransExeTime>1:57 PM</TransExeTime> <TransMode tc="2">Original</TransMode> <TestIndicator tc="1">True</TestIndicator> <TransResult> <ResultCode tc="1">SUCCESS</ResultCode> </TransResult> <OLife> <SourceInfo> <CreationDate>6/14/2013</CreationDate> <CreationTime>1:57 PM</CreationTime> <SourceInfoName>The Company Name</SourceInfoName> </SourceInfo> </OLife> </TXLifeResponse> </TXLife> </Body> </Envelope>
忽略日期和时间格式.我知道他们不匹配,但这是我稍后会关注的事情,就像我将硬编码的值一样.我更关心XML格式,特别是以下内容:
>为什么XDeclaration不出现在XML结果中?
>在肥皂信封和身体上,为什么不出现肥皂前缀?
>如何抑制和TXLifeResponse上的xmlns属性>标签?
我已经在参考此链接的其他类似问题的答案中看到了参考:
http://msdn.microsoft.com/en-us/library/bb387042.aspx
但这对我没什么帮助.
解决方法
> ToString()方法永远不会发出XML声明.
原因是一个不同的故事,但请检查xdoc.Save(“sample.xml”);写下声明.
>在XNamespace soap =“http://www.w3.org/2001/12/soap-envelope”;您可能有拼写错误,请将其更改为http://schemas.xmlsoap.org/soap/envelope/
>您必须为TXLife元素的所有子元素指定默认命名空间,如下所示:
原因是一个不同的故事,但请检查xdoc.Save(“sample.xml”);写下声明.
>在XNamespace soap =“http://www.w3.org/2001/12/soap-envelope”;您可能有拼写错误,请将其更改为http://schemas.xmlsoap.org/soap/envelope/
>您必须为TXLife元素的所有子元素指定默认命名空间,如下所示:
new XElement(xmlns + "UserAuthResponse",new XElement(xmlns + "TransResult",new XElement(xmlns + "ResultCode",resultCode)
希望这可以帮助