微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 使用Linq to XML创建响应xml的命名空间问题

我是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元素的所有子元素指定认命名空间,如下所示:

new XElement(xmlns + "UserAuthResponse",new XElement(xmlns + "TransResult",new XElement(xmlns + "ResultCode",resultCode)

希望这可以帮助

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐