soap 相关问题

简单对象访问协议(SOAP)是用于在Web服务的实现中交换结构化信息的协议规范。

org.springframework.oxm.UncategorizedMappingException:未知的 JAXB 异常

我正在从 Spring Boot 2.7.6 迁移到 Spring Boot 3.0.5,从 Java 11 迁移到 Java 17。调用 soap 客户端时,我在运行时遇到这个错误:jakarta.xml.bind.JAXBException: class MyClass。 ..

回答 0 投票 0

java中如何给带有附件的SOAP请求添加数字签名

我需要为带有附件的 SOAP 请求添加数字签名。我尝试了几种使用 xmlsec-3.0.2.jar 和 javax.xml.crypto 库的方法。但是他们都没有按预期工作....

回答 0 投票 0

Python API 中的随机连接中止超时错误 10060

我正在使用 python 套接字连接到服务器,但有时我会一个接一个地遇到以下异常: TimeoutError: [WinError 10060] 连接尝试失败,因为连接的参数...

回答 0 投票 0

获取异常 - org.apache.axis2.AxisFault:未声明的命名空间前缀“soapenv”

我收到异常 - org.apache.axis2.AxisFault:未声明的命名空间前缀“soapenv”。 为了解决,我在类路径中添加了以下 jars - 公理-api-1.4.0 公理-dom-1.4.0 公理-

回答 0 投票 0

java.util.ServiceLoader 无法加载提供者

几天来我一直在努力解决我的问题,但没有成功,需要帮助。 我们一直在将我们的应用程序(超过 20 个)中的 Java 版本从 8 升级到 17,而我们只使用其中的 2 个

回答 0 投票 0

在 WSO2 API Manager 4.1 中使用 WSDL 1.1 作为 REST API 公开 SOAP API

我尝试公开我的旧 SOAP 后端,它使用 WSDL 1.1 版作为 WSO2 API 管理器中的 REST API,但我收到此错误“错误:响应状态为 415”。 如下图所示

回答 0 投票 0

等待异步值的最佳方式

用户从外部系统请求特定信息。 因此,一个 http 请求被发送到我们的系统并等待响应。 通常这很容易,但外部系统正在使用

回答 1 投票 0

WSDL SOAP marshall double type 无点

我在 Kotlin 上有 spring SOAP 服务。使用 wsdl 文件,我为 SOAP 请求和响应生成了 java 类。有什么方法可以打印 Java 原始双精度类型(它是 我在 Kotlin 上有 spring SOAP 服务。使用 wsdl 文件,我为 SOAP 请求和响应生成了 java 类。有什么方法可以打印 Java 基本双精度类型(它是 在模式http://www.w3.org/2001/XMLSchema)没有点? 我现在拥有的: 1002775.0 我想要的: 1002775 我看到这个最近的问题 为需要具有模式的整数的元素使用 JAXB 生成的类 但不明白在我的情况下我必须如何编写 binds.xml 文件

回答 0 投票 0

重用信封名称空间创建 SOAP 主体

我需要通过以下方式创建 SOAP 消息(注意示例:SomeCommand): 我需要通过以下方式创建 SOAP 消息(注意 example:SomeCommand): <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:example="example.com"> <SOAP-ENV:Header/> <SOAP-ENV:Body> <example:SomeCommand> <Field1>field1</Field1> <Field2>field2</Field2> </example:SomeCommand> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 我有以下代码: public String marshal() throws Exception { SomeCommand someCommand = new SomeCommand("field1", "field2"); DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); Document document = documentBuilderFactory.newDocumentBuilder().newDocument(); Marshaller marshaller = JAXBContext.newInstance(SomeCommand.class).createMarshaller(); marshaller.marshal(someCommand, document); SOAPMessage soapMessage = MessageFactory.newInstance().createMessage(); soapMessage.getSOAPPart().getEnvelope().addNamespaceDeclaration( "example", "example.com"); soapMessage.getSOAPBody().addDocument(document); OutputStream outputStream = new ByteArrayOutputStream(); soapMessage.writeTo(outputStream); return outputStream.toString(); } SomeCommand在哪里: @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "") @XmlRootElement(namespace = "example.com", name = "SomeCommand") public class SomeCommand { @XmlElement(name = "Field1", required = true) private String field1; @XmlElement(name = "Field2", required = true) private String field2; public SomeCommand(){} public SomeCommand(String field1, String field2){ this.field1 = field1; this.field2 = field2; } } 但结果是: <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:example="example.com"> <SOAP-ENV:Header/> <SOAP-ENV:Body> <ns2:SomeCommand xmlns:ns2="example.com"> <Field1>field1</Field1> <Field2>field2</Field2> </ns2:SomeCommand> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 有没有什么方法可以在 SOAP 消息的正文中附加一个文档,重用现有的命名空间 (example) 而不是重新定义它们? 提前致谢。

回答 0 投票 0

使用外部命名空间创建 XML 内容

我需要通过以下方式创建 SOAP 消息(注意示例:SomeCommand): 我需要通过以下方式创建 SOAP 消息(注意 example:SomeCommand): <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:example="example.com"> <SOAP-ENV:Header/> <SOAP-ENV:Body> <example:SomeCommand> <Field1>field1</Field1> <Field2>field2</Field2> </example:SomeCommand> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 我有以下代码: public String marshal() throws Exception { SomeCommand someCommand = new SomeCommand("field1", "field2"); DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); Document document = documentBuilderFactory.newDocumentBuilder().newDocument(); Marshaller marshaller = JAXBContext.newInstance(SomeCommand.class).createMarshaller(); marshaller.marshal(someCommand, document); SOAPMessage soapMessage = MessageFactory.newInstance().createMessage(); soapMessage.getSOAPPart().getEnvelope().addNamespaceDeclaration( "example", "example.com"); soapMessage.getSOAPBody().addDocument(document); OutputStream outputStream = new ByteArrayOutputStream(); soapMessage.writeTo(outputStream); return outputStream.toString(); } SomeCommand在哪里: @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "") @XmlRootElement(namespace = "example.com", name = "SomeCommand") public class SomeCommand { @XmlElement(name = "Field1", required = true) private String field1; @XmlElement(name = "Field2", required = true) private String field2; public SomeCommand(){} public SomeCommand(String field1, String field2){ this.field1 = field1; this.field2 = field2; } } 但结果是: <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:example="example.com"> <SOAP-ENV:Header/> <SOAP-ENV:Body> <ns2:SomeCommand xmlns:ns2="example.com"> <Field1>field1</Field1> <Field2>field2</Field2> </ns2:SomeCommand> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 有没有什么方法可以在 SOAP 消息的正文中附加一个文档,重用现有的命名空间 (example) 而不是重新定义它们? 提前致谢。

回答 0 投票 0

致命错误:未捕获错误:找不到类“SoapClient”

您好,我正在尝试使用适用于加拿大的 UPS API 进行构建。该文档非常粗糙,我很难理解它...... 我的代码如下: 您好,我正在尝试使用适用于加拿大的 UPS API 进行构建。该文档非常粗糙,我很难理解它...... 我的代码如下: <?php //Configuration $outputFileName = "XOLTResult.xml"; $access = "XXXX"; $userid = "XXXX"; $passwd = 'XXXX'; $wsdl = file_get_contents("RateWS.WSDL"); $operation = "ProcessRate"; $endpointurl = 'https://wwwcie.ups.com/webservices/FreightRate'; //create soap request $option['RequestOption'] = 'RateChecking Option'; $request['Request'] = $option; $shipfrom['Name'] = 'Good Incorporation'; $addressFrom['AddressLine'] = '2010 WARSAW ROAD'; $addressFrom['City'] = 'Roswell'; $addressFrom['StateProvinceCode'] = 'GA'; $addressFrom['PostalCode'] = '30076'; $addressFrom['CountryCode'] = 'US'; $shipfrom['Address'] = $addressFrom; $request['ShipFrom'] = $shipfrom; $shipto['Name'] = 'Sony Company Incorporation'; $addressTo['AddressLine'] = '2311 YORK ROAD'; $addressTo['City'] = 'TIMONIUM'; $addressTo['StateProvinceCode'] = 'MD'; $addressTo['PostalCode'] = '21093'; $addressTo['CountryCode'] = 'US'; $shipto['Address'] = $addressTo; $request['ShipTo'] = $shipto; $payer['Name'] = 'Payer inc'; $addressPayer['AddressLine'] = '435 SOUTH STREET'; $addressPayer['City'] = 'RIS TOWNSHIP'; $addressPayer['StateProvinceCode'] = 'NJ'; $addressPayer['PostalCode'] = '07960'; $addressPayer['CountryCode'] = 'US'; $payer['Address'] = $addressPayer; $shipmentbillingoption['Code'] = '10'; $shipmentbillingoption['Description'] = 'PREPAID'; $paymentinformation['Payer'] = $payer; $paymentinformation['ShipmentBillingOption'] = $shipmentbillingoption; $request['PaymentInformation'] = $paymentinformation; $service['Code'] = '02'; $service['Description'] = '2nd Day Air'; $request['Service'] = $service; $commodity['CommodityID'] = ''; $commodity['Description'] = 'No Description'; $commodity['Weight'] = array ( 'UnitOfMeasurement' => array ( 'Code' => 'LBS', 'Description' => 'Pounds' ), 'Value' => '11' ); $commodity['Dimensions'] = array ( 'UnitOfMeasurement' => array ( 'Code' => 'IN', 'Description' => 'Inches' ), 'Length' => '23', 'Width' => '17', 'Height' => '45' ); $commodity['NumberOfPieces'] = '1'; $commodity['DangerousGoodsIndicator'] = ''; $commodity['CommodityValue'] = array ( 'CurrencyCode' => 'CAD', 'MonetaryValue' => '500' ); $request['Commodity'] = $commodity; $shipmentserviceoptions['PickupOptions'] = array ( 'HolidayPickupIndicator' => '', 'InsidePickupIndicator' => '', 'ResidentialPickupIndicator' => '', 'WeekendPickupIndicator' => '', 'LiftGateRequiredIndicator' => '' ); try { $mode = array ( 'soap_version' => 'SOAP_1_1', // use soap 1.1 client 'trace' => 1 ); // initialize soap client $client = new SoapClient($wsdl , $mode); //set endpoint url $client->__setLocation($endpointurl); //create soap header $usernameToken['Username'] = $userid; $usernameToken['Password'] = $passwd; $serviceAccessLicense['AccessLicenseNumber'] = $access; $upss['UsernameToken'] = $usernameToken; $upss['ServiceAccessToken'] = $serviceAccessLicense; $header = new SoapHeader('http://www.ups.com/XMLSchema/XOLTWS/UPSS/v1.0','UPSSecurity',$upss); $client->__setSoapHeaders($header); //get response $resp = $client->__soapCall($operation ,array(processFreightRate())); //get status echo "Response Status: " . $resp->Response->ResponseStatus->Description ."\n"; //save soap request and response to file $fw = fopen($outputFileName , 'w'); fwrite($fw , "Request: \n" . $client->__getLastRequest() . "\n"); fwrite($fw , "Response: \n" . $client->__getLastResponse() . "\n"); fclose($fw); } catch(Exception $ex) { print_r ($ex); } ?> 我收到以下错误: 致命错误:未捕获错误:在 C:\xampp\htdocs\upsapi\RatingPACKAGE\PACKAGEWebServices\CodeSamples\Rate\PHP\SoapRateClient.php:121 中找不到类“SoapClient”堆栈跟踪:#0 {main} thrown in C: \xampp\htdocs\upsapi\RatingPACKAGE\PACKAGEWebServices\CodeSamples\Rate\PHP\SoapRateClient.php 第 121 行 任何帮助将不胜感激。 soap 客户端似乎不在服务器上,但我相信这已经解决了 SoapFault 对象 ( [message:protected] => SOAP-ERROR: 解析 WSDL: 无法从 ' ' 加载:无法加载外部实体 " " [string:Exception:private] => [code:protected] => 0 [file:protected] => C:\xampp\htdocs\upsapi\ShippingPACKAGE\PACKAGEWebServices\CodeSamples\Ship\PHP\SoapShipClient.php [line:protected] => 185 [trace:Exception:private] => Array ( [0 ] => 数组 ( [文件] => C:\xampp\htdocs\upsapi\ShippingPACKAGE\PACKAGEWebServices\CodeSamples\Ship\PHP\SoapShipClient.php [行] => 185 [函数] => __construct [类] => SoapClient [type] => -> [args] => Array ( [0] => [1] => Array ( [soap_version] => SOAP_1_1 [trace] => 1 ) ) ) ) [previous:Exception:private] = > [faultstring] => SOAP-ERROR:解析 WSDL:无法从“”加载:无法加载外部实体“” [faultcode] => WSDL [faultcodens] => [faultactor] => [detail] => [ _name] => [headerfault] => ) 在 XAMPP 控制面板中 停止 Apache 服务器 点击 Apache 旁边的Config 从下拉列表中选择PHP (php.ini) Ctrl+F 查找 ;extension=soap 从行中删除 ;。 Ctrl+S 保存文件。 再次启动Apache。 扩展=肥皂 我删除';'但不工作 在我重新启动 pc 和 apachi 但在 xamp、localhost 中还不能工作后

回答 2 投票 0

如何从空手道 DSL 中的 SOAP 响应中获取特定标签的值?

我正在尝试验证来自以下 SOAP 响应的“成功”消息。但它正在返回“#notpresent。 我们如何定位特定的内部属性,如 messageDate 或 messa ...

回答 1 投票 0

在 Java 中解析 SOAP 响应的最佳方法是什么

我使用 saaj 调用 soap api 并将响应存储在文件中。以下是回应的一部分: 我使用 saaj 调用 soap api 并将响应存储在文件中。以下是部分回复: <?xml version="1.0" encoding="UTF-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soap:Body> <AdjPriceResponse xmlns="http://tsetmc.com/"> <AdjPriceResult> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="TseAdjPrice"> <xs:element name="TseAdjPrice" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="TseAdjPrice"> <xs:complexType> <xs:sequence> <xs:element name="InsCode" type="xs:long" minOccurs="0" /> <xs:element name="DEven" type="xs:int" minOccurs="0" /> <xs:element name="PClosing" type="xs:decimal" minOccurs="0" /> <xs:element name="PClosingNoAdj" type="xs:decimal" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> </xs:element> </xs:schema> <diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <TseAdjPrice xmlns=""> <TseAdjPrice diffgr:id="TseAdjPrice1" msdata:rowOrder="0"> <InsCode>180774784936665</InsCode> <DEven>20100707</DEven> <PClosing>1786</PClosing> <PClosingNoAdj>2136</PClosingNoAdj> </TseAdjPrice> <TseAdjPrice diffgr:id="TseAdjPrice2" msdata:rowOrder="1"> <InsCode>180774784936665</InsCode> <DEven>20110724</DEven> <PClosing>1865</PClosing> <PClosingNoAdj>2215</PClosingNoAdj> </TseAdjPrice> </TseAdjPrice> </diffgr:diffgram> </AdjPriceResult> </AdjPriceResponse> 我使用“JAXB”创建bean类,但是出现了这个错误: Complex type and its child element share the same name "TseAdjPrice". Use a class customization to resolve this conflict. 我尝试绑定外部文件来解决它,但我不知道在哪里以及如何将它添加到项目中,所以我将xsd和xml文件中的根元素名称从“TseAdjPrice”更改为“MainTseAdjPrice”并成功生成MainTseAdjPrice.java 类与 Jaxb。但我又遇到了另一个错误: The prefix "diffgr" for attribute "diffgr:id" associated with an element type "TseAdjPrice" is not bound. 我继续调试我的代码,最后我成功地通过省略多行输出代码来解析输出。这是修改后的输出: <?xml version="1.0" encoding="UTF-8"?> <MainTseAdjPrice> <TseAdjPrice diffgrid="TseAdjPrice1866" msdatarowOrder="1865"> <InsCode>71744682148776880</InsCode> <DEven>20120521</DEven> <PClosing>915</PClosing> <PClosingNoAdj>1265</PClosingNoAdj> </TseAdjPrice> <TseAdjPrice diffgrid="TseAdjPrice1867" msdatarowOrder="1866"> <InsCode>71744682148776880</InsCode> <DEven>20140312</DEven> <PClosing>1630</PClosing> <PClosingNoAdj>1780</PClosingNoAdj> </TseAdjPrice> </MainTseAdjPrice> 我省略输出是否正确?有没有更好的方法在不修改输出的情况下解析 xml? 我也有相同格式的响应试图解析,你有参考你是如何实现的?

回答 1 投票 0

如何将身份验证标头添加到 SOAP 请求

我正在使用 Spring Integration 4.2.4.RELEASE,它似乎不想将我的授权标头添加到 SOAP 请求中。 这是相关的弹簧集成配置: 我正在使用 Spring Integration 4.2.4.RELEASE,它似乎不想将我的授权标头添加到 SOAP 请求中。 这里是相关的spring-integration配置: <ws:outbound-gateway uri="${soap.ws.url}" message-factory="messageFactory" message-sender="messageSender"/> <bean id="httpClientFactory" class="com.myorg.http.HttpClientFactoryBean"> <property name="credentials" ref="httpClientCredentials"/> </bean> <bean name="messageSender" class="org.springframework.ws.transport.http.HttpComponentsMessageSender"> <property name="credentials" ref="httpClientCredentials"/> <property name="httpClient" ref="httpClientFactory"/> </bean> <bean id="httpClientCredentials" class="org.apache.http.auth.UsernamePasswordCredentials"> <constructor-arg value="${username}"/> <constructor-arg value="${password}"/> </bean> <bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory"> <property name="soapVersion"> <util:constant static-field="org.springframework.ws.soap.SoapVersion.SOAP_11"/> </property> <property name="messageFactory" ref="myMessageFactory" /> </bean> <bean id="myMessageFactory" class="com.myorg.soap.CustomMessageFactory" /> 这是自定义消息工厂类 package com.myorg.soap; import com.sun.xml.messaging.saaj.soap.MessageFactoryImpl; import com.sun.xml.messaging.saaj.soap.ver1_1.Message1_1Impl; import javax.xml.soap.MimeHeaders; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPMessage; import java.io.IOException; import java.io.InputStream; /** * Custom Message Factory. */ public class CustomMessageFactory extends MessageFactoryImpl { /** * Class Constructor. * * @return Message1_1Impl * @throws SOAPException when there is a SOAP error. */ @Override public SOAPMessage createMessage() throws SOAPException { return new Message1_1Impl(); } /** * Create a new message. * * @param mimeHeaders headers to add to the message * @param in input stream to use in the message. * @return New SOAP 1.1 message. * @throws IOException when there is an IO error * @throws SOAPException when there is a SOAP error */ @Override public SOAPMessage createMessage(final MimeHeaders mimeHeaders, final InputStream in) throws IOException, SOAPException { MimeHeaders headers = mimeHeaders; if (headers == null) { headers = new MimeHeaders(); } headers.setHeader("Content-Type", "text/xml"); Message1_1Impl msg = new Message1_1Impl(headers, in); msg.setLazyAttachments(this.lazyAttachments); return msg; } } 这是自定义的 httpClientFactory 类 package com.myorg.http; import org.apache.http.auth.AuthScope; import org.apache.http.auth.Credentials; import org.apache.http.client.CredentialsProvider; import org.apache.http.client.HttpClient; import org.apache.http.config.SocketConfig; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.client.HttpClientBuilder; import org.springframework.beans.factory.FactoryBean; /** * Provide an HttpClient factory bean, so we can configure the ODE web service client to use TLS1.1 and TLS1.2. */ public class HttpClientFactoryBean implements FactoryBean<HttpClient> { /** * Default socket timeout will be 15 seconds. */ private static final int DEFAULT_READ_TIMEOUT_MILLISECONDS = (15 * 1000); /** * Max connections defaults to 5. */ private static final int MAX_CONNECTIONS = 5; /** * Local storage for credentials. */ private Credentials credentials; @Override public HttpClient getObject() throws Exception { HttpClientBuilder builder = HttpClientBuilder.create(); SocketConfig socketConfig = SocketConfig.custom() .setSoTimeout(DEFAULT_READ_TIMEOUT_MILLISECONDS) .build(); builder.useSystemProperties() .setMaxConnTotal(MAX_CONNECTIONS) .setDefaultSocketConfig(socketConfig); if (credentials != null) { CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, credentials); builder.setDefaultCredentialsProvider(credentialsProvider); } return builder.build(); } @Override public Class<?> getObjectType() { return HttpClient.class; } @Override public boolean isSingleton() { return true; } public Credentials getCredentials() { return credentials; } public void setCredentials(final Credentials credentials) { this.credentials = credentials; } } 我看到的问题是授权标头似乎没有在请求中设置。我错过了什么? 我遵循 spring 消费 web 服务指南“https://spring.io/guides/gs/consuming-web-service/#initial”也有一个例子。但是没有如何添加基本授权。所以你可以这样使用 public class WebServiceMessageSenderWithAuth extends HttpUrlConnectionMessageSender { private String username; private String password; @Override protected void prepareConnection(HttpURLConnection connection) throws IOException { BASE64Encoder enc = new sun.misc.BASE64Encoder(); String userpassword = username+":"+password; String encodedAuthorization = enc.encode( userpassword.getBytes() ); connection.setRequestProperty("Authorization", "Basic " + encodedAuthorization); super.prepareConnection(connection); } } 和 public YourClient yourClient(Jaxb2Marshaller marshaller){ YourClient client = new YourClient(); WebServiceTemplate template = client.getWebServiceTemplate(); template.setMessageSender(new WebServiceMessageSenderWithAuth()); client.setDefaultUri("http://examplesap.com/xx/WebService/soap1.1x"); client.setMarshaller(marshaller); client.setUnmarshaller(marshaller); return client; } 然后打电话.. return (YourResponseModel) getWebServiceTemplate() .marshalSendAndReceive(url, request, new SoapActionCallback( "http://examplesap.com/xx/WebService/soap1.1x"));

回答 1 投票 0

C# 给出空值的 SOAP XML 问题

我正在尝试使用 C# 获取 xml 节点,但我无法使其工作,并且变量为我提供了空值。 这是我的肥皂 xml: 字符串 xmlString = @" 我正在尝试使用 C# 获取 xml 节点,但我无法使其工作,并且变量给了我空值。 这是我的肥皂 xml: string xmlString = @"<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:ser=""http://servicio.wstomaservicioscodimp.guatex.com/""> <soapenv:Header/> <soapenv:Body> <ser:tomaServicioGTX> <!--Optional:--> <xmlentrada> <![CDATA[ <TOMA_SERVICIO> <USUARIO>WSGUATEX</USUARIO> <PASSWORD>GTXWSQ23</PASSWORD> <CODIGO_COBRO>CON0055</CODIGO_COBRO> <SERVICIO> <TIPO_USUARIO>value</TIPO_USUARIO> <NOMBRE_REMITENTE></NOMBRE_REMITENTE> <TELEFONO_REMITENTE></TELEFONO_REMITENTE> <DIRECCION_REMITENTE></DIRECCION_REMITENTE> <MUNICIPIO_ORIGEN>A</MUNICIPIO_ORIGEN> <PUNTO_ORIGEN>A</PUNTO_ORIGEN> <ESTA_LISTO>S</ESTA_LISTO> <CODORIGEN>223</CODORIGEN> <GUIA> <LLAVE_CLIENTE></LLAVE_CLIENTE> <CODIGO_COBRO_GUIA></CODIGO_COBRO_GUIA> <NOMBRE_DESTINATARIO></NOMBRE_DESTINATARIO> <TELEFONO_DESTINATARIO></TELEFONO_DESTINATARIO> <DIRECCION_DESTINATARIO></DIRECCION_DESTINATARIO> <MUNICIPIO_DESTINO></MUNICIPIO_DESTINO> <PUNTO_DESTINO></PUNTO_DESTINO> <RECOGE_OFICINA></RECOGE_OFICINA> <CODDESTINO></CODDESTINO> </GUIA> </SERVICIO> </TOMA_SERVICIO> ]]> </xmlentrada> </ser:tomaServicioGTX> </soapenv:Body> </soapenv:Envelope>"; 我只是想获取TIPO_USUARIO、NOMBRE_REMITENTE、TELEFONO_REMITENTE等等..节点并用信息填充它们。 我试过这个: XmlDocument xmlDocument = new XmlDocument(); xmlDocument.LoadXml(xmlString); // Select the "TIPO_USUARIO" node using XPath XmlNode tipoUsuarioNode = xmlDocument.SelectSingleNode("//SERVICIO/TIPO_USUARIO"); // Get the value of the "TIPO_USUARIO" node string tipoUsuarioValue = tipoUsuarioNode.InnerText; 但问题是 tipoUsuarioNode 给了我 null,我不知道为什么。我该如何解决这个问题?我试了好几个小时,但没有任何形式...... 通过 LINQ to XML API 查看操作方法。它自 2007 年起在 .Net Framework 中可用。 术语 CDATA 的意思是字符数据。 CDATA 部分定义为未被解析器解析但被识别为标记的文本块。 这就是解决方案分为三个步骤的原因: 将 CData 部分作为文本放入 XDocument xmlentrada. 从中获取 SERVICIO 元素。 获取感兴趣的单个 XML 元素文本值。 c# void Main() { XDocument xdoc = XDocument.Parse(@"<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' xmlns:ser='http://servicio.wstomaservicioscodimp.guatex.com/'> <soapenv:Header/> <soapenv:Body> <ser:tomaServicioGTX> <!--Optional:--> <xmlentrada><![CDATA[ <TOMA_SERVICIO> <USUARIO>WSGUATEX</USUARIO> <PASSWORD>GTXWSQ23</PASSWORD> <CODIGO_COBRO>CON0055</CODIGO_COBRO> <SERVICIO> <TIPO_USUARIO>value</TIPO_USUARIO> <NOMBRE_REMITENTE>value2</NOMBRE_REMITENTE> <TELEFONO_REMITENTE></TELEFONO_REMITENTE> <DIRECCION_REMITENTE></DIRECCION_REMITENTE> <MUNICIPIO_ORIGEN>A</MUNICIPIO_ORIGEN> <PUNTO_ORIGEN>A</PUNTO_ORIGEN> <ESTA_LISTO>S</ESTA_LISTO> <CODORIGEN>223</CODORIGEN> <GUIA> <LLAVE_CLIENTE></LLAVE_CLIENTE> <CODIGO_COBRO_GUIA></CODIGO_COBRO_GUIA> <NOMBRE_DESTINATARIO></NOMBRE_DESTINATARIO> <TELEFONO_DESTINATARIO></TELEFONO_DESTINATARIO> <DIRECCION_DESTINATARIO></DIRECCION_DESTINATARIO> <MUNICIPIO_DESTINO></MUNICIPIO_DESTINO> <PUNTO_DESTINO></PUNTO_DESTINO> <RECOGE_OFICINA></RECOGE_OFICINA> <CODDESTINO></CODDESTINO> </GUIA> </SERVICIO> </TOMA_SERVICIO> ]]> </xmlentrada> </ser:tomaServicioGTX> </soapenv:Body> </soapenv:Envelope>"); XDocument xmlentrada = XDocument.Parse(xdoc.Descendants("xmlentrada").FirstOrDefault().Value); XElement servicio = xmlentrada.Descendants("SERVICIO").FirstOrDefault(); Console.WriteLine("TIPO_USUARIO='{0}', NOMBRE_REMITENTE='{1}'", servicio.Element("TIPO_USUARIO")?.Value, servicio.Element("NOMBRE_REMITENTE")?.Value); } 输出 TIPO_USUARIO='value', NOMBRE_REMITENTE='value2' 您要编辑的 XML 被双重包装到 CDATA 元素中。您需要解析出外部 XML,获取 CDATA 元素并解析它,然后您可以对其进行编辑并将其写回。 Linq-To-XML 更适合这种事情 var xml1 = XElement.Parse(xmlString); var data = (XCData) xml1.Descendants("xmlentrada").First().Nodes().First(); var xml2 = XElement.Parse(data.Value); var SERVICIO = xml2.Element("SERVICIO"); SERVICIO.Element("TIPO_USUARIO").Value = "someName"; // more changes here data.Value = SERVICIO.ToString(); Console.WriteLine(xml1); dotnetfiddle

回答 2 投票 0

如何在 SoapUI 中处理 OAuth2 的登录页面

在 SoapUI 中使用 javascript 登录页面自动化时出现类型错误 谁能帮我解决这个问题?

回答 0 投票 0

如何通过 Web 服务发送 ArrayList?

主题是我真正的问题,但我想知道关于网络服务的另一个问题。 Web服务返回东西的关键点是什么? 可序列化(因为一切 在...之前转换为 XML

回答 2 投票 0

Soap API 调用无法正常工作/找不到方法

我正在尝试调用 soap api。我必须 wsdl 文件并使用 svcutil 创建一个名为“PublicPortalServiceJSONPortTypeClient”的代理类。我已经关注了微软

回答 0 投票 0

METRO SOAP Web 服务不适用于 Tomcat 9 和 Java 11

我们已经将我们的项目从 Java 8 迁移到 Java 11,之后 ws-security 在我们的应用程序中不起作用。 添加 JVM_PARAMS="$JVM_PARAMS --upgrade-module-path /Tomcat/upgradable" 在设置...

回答 0 投票 0

使用 Postman 发送 SOAP 请求

我正在尝试按照此处找到的 API 文档向 Loqate 服务发送 SOAP 请求。 文档说 SOAP 端点是 https://api.addressy.com/Capture/Interactive/Fin...

回答 2 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.