【问题标题】:How to update soap xml file element value in c#.net如何在c#.net中更新soap xml文件元素值
【发布时间】:2016-01-05 14:11:26
【问题描述】:

如何使用 c#.net 从soap xml 文件更新SOAP xml 元素值?我的文件如下:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
   <soap:Header>
      <Action  xmlns="http://www.w3.org/2005/08/addressing">http://extn.ssac.ee.sim.dsh.cms.hhs.gov/SsaCompositePortType/VerifySSAResponse</Action>
      <MessageID xmlns="http://www.w3.org/2005/08/addressing">urn:uuid:27f0af81-0da7-441f-83a7-fb2beaf30664</MessageID>
      <RelatesTo xmlns="http://www.w3.org/2005/08/addressing">uuid:e8dcd685-cb86-400a-8059-dcad985a7ea7</RelatesTo>
   </soap:Header>
   <soap:Body>
      <exch:SSACompositeResponse xmlns:exch="http://ssac.ee.sim.dsh.cms.hhs.gov">
         <ssac:SSACompositeIndividualResponse xmlns:ssac="http://extn.ssac.ee.sim.dsh.cms.hhs.gov">
            <ssac:ResponseMetadata>
               <ssac:ResponseCode>HS000000</ssac:ResponseCode>
              <ssac:ResponseDescriptionText>Success</ssac:ResponseDescriptionText>
            </ssac:ResponseMetadata>
          <ssac:PersonSSNIdentification>199123051</ssac:PersonSSNIdentification>
        <ssac:SSAResponse>
           <ssac:SSNVerificationIndicator>true</ssac:SSNVerificationIndicator>
           <ssac:DeathConfirmationCode>Unconfirmed</ssac:DeathConfirmationCode>
           <nc:PersonUSCitizenIndicator xmlns:nc="http://niem.gov/niem/niem-core/2.0">true</nc:PersonUSCitizenIndicator>
           <ssac:PersonIncarcerationInformationIndicator>false</ssac:PersonIncarcerationInformationIndicator>
           <ssac:SSATitleIIAnnualIncomeInformationIndicator>false</ssac:SSATitleIIAnnualIncomeInformationIndicator>
           <ssac:SSATitleIIMonthlyIncomeInformationIndicator>false</ssac:SSATitleIIMonthlyIncomeInformationIndicator>
           <ssac:SSAQuartersOfCoverageInformationIndicator>false</ssac:SSAQuartersOfCoverageInformationIndicator>
        </ssac:SSAResponse>
     </ssac:SSACompositeIndividualResponse>
  </exch:SSACompositeResponse>

这里我想将 ssac:PersonSSNIdentification (199123051) 值更新为 9876543210?

                XmlNamespaceManager xnm;
                xnm = new XmlNamespaceManager(new NameTable());
                xnm.AddNamespace("soap", "http://www.w3.org/2003/05/soap-envelope");
                var xmlDoc = new XmlDocument();
                xmlDoc.Load(newSSAPathName);
                XmlNodeList aNodes = xmlDoc.SelectNodes("/Envelope/Body/SSACompositeResponse/SSACompositeIndividualResponse");
                foreach (XmlNode aNode in aNodes)
                {  var innerXmlNode = aNode.SelectSingleNode("/PersonSSNIdentification");
                    if (innerXmlNode != null)
                    {  innerXmlNode.Value = lstSsn[0];
                    }
                }
                xmlDoc.Save(newSSAPathName);

但这不起作用……有什么办法吗……

【问题讨论】:

  • 你尝试了什么?
  • 好吧,我尝试使用 XmlNamespaceManager 和 XmlDocument..但没有工作

标签: c# xml soap


【解决方案1】:

我建议使用 LINQ to XML 而不是较旧的 XmlDocument API 来执行此操作。

首先,将您的 XML 加载到 XDocument

        var doc = XDocument.Load(newSSAPathName);

然后,为您在 XML 中的每个命名空间定义一个 XNamespace

        var soap = (XNamespace)"http://www.w3.org/2003/05/soap-envelope";
        var exch = (XNamespace)"http://ssac.ee.sim.dsh.cms.hhs.gov";
        var ssac = (XNamespace)"http://extn.ssac.ee.sim.dsh.cms.hhs.gov";

现在使用所需的完全限定名称查询 XML 层次结构中所需深度的所有 elements

        var ssnIds = doc.Elements(soap + "Envelope")
            .Elements(soap + "Body")
            .Elements(exch + "SSACompositeResponse")
            .Elements(ssac + "SSACompositeIndividualResponse")
            .Elements(ssac + "PersonSSNIdentification");

最后,更改适当的元素值:

        foreach (var ssnId in ssnIds)
            if (ssnId.Value == "199123051")
                ssnId.Value = "9876543210";

或者,如果您确实想使用 XPATH 查询,则需要使用所有 3 个命名空间填充 XmlNamespaceManagerXPathSelectElements(XNode, String, IXmlNamespaceResolver)documentation 显示了如何执行此操作。然后使用您选择的与 XPATH 查询中的每个命名空间相对应的前缀:

        using (var reader = XmlReader.Create(newSSAPathName))
        {
            var doc = XDocument.Load(reader);

            // Set up a namespaceManager as described in https://msdn.microsoft.com/en-us/library/bb351355%28v=vs.110%29.aspx
            var nameTable = reader.NameTable;
            var namespaceManager = new XmlNamespaceManager(nameTable);
            namespaceManager.AddNamespace("soap", "http://www.w3.org/2003/05/soap-envelope");
            namespaceManager.AddNamespace("exch", "http://ssac.ee.sim.dsh.cms.hhs.gov");
            namespaceManager.AddNamespace("ssac", "http://extn.ssac.ee.sim.dsh.cms.hhs.gov");

            var ssnIds = doc.XPathSelectElements("soap:Envelope/soap:Body/exch:SSACompositeResponse/ssac:SSACompositeIndividualResponse/ssac:PersonSSNIdentification", namespaceManager);

            foreach (var ssnId in ssnIds)
                if (ssnId.Value == "199123051")
                    ssnId.Value = "9876543210";
        }

请务必在文件开头使用using System.Xml.XPath;,因为XPathSelectElements 是一种扩展方法。

更新

使用XmlDocument,等效的XPATH查询是:

        var xmlDoc = new XmlDocument();
        xmlDoc.Load(newSSAPathName);

        var nameTable = xmlDoc.NameTable;
        var namespaceManager = new XmlNamespaceManager(nameTable);
        namespaceManager.AddNamespace("soap", "http://www.w3.org/2003/05/soap-envelope");
        namespaceManager.AddNamespace("exch", "http://ssac.ee.sim.dsh.cms.hhs.gov");
        namespaceManager.AddNamespace("ssac", "http://extn.ssac.ee.sim.dsh.cms.hhs.gov");

        var ssnIds = xmlDoc.SelectNodes("soap:Envelope/soap:Body/exch:SSACompositeResponse/ssac:SSACompositeIndividualResponse/ssac:PersonSSNIdentification", namespaceManager);

        foreach (XmlNode ssnId in ssnIds)
            if (ssnId.InnerText == "199123051")
                ssnId.InnerText = "9876543210";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多