我是.net核心的新手,我正在尝试创建一个控制台应用程序,该控制台应用程序在.net核心项目中使用SOAP Web服务。我一直在寻找图书馆,但找不到任何图书馆。我开始编码,并将其传递到可以从SOAP请求接收XML的Point。 现在我的问题是,我的代码以纯文本格式打印所有XML,不是非常有用。我试图在XML中访问我的数据,但没有成功。
我这样做很难吗?有没有一种方法或库可以使使用起来更容易?
/// <summary>
/// Execute a Soap WebService call
/// </summary>
public static void Execute()
{
HttpWebRequest request = CreateWebRequest();
XmlDocument soapEnvelopeXml = new XmlDocument();
soapEnvelopeXml.LoadXml(@"<?xml version=""1.0"" encoding=""utf-8""?>
<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:GET-AG=""http://ortsinfoV13x0.stromgas.services.getag.com"">
<soapenv:Header></soapenv:Header>
<soapenv:Body>
<GET-AG:getOrteByPlz>
<GET-AG:rec>
<GET-AG:auth_LoginName>----------</GET-AG:auth_LoginName>
<GET-AG:auth_Passwort>------</GET-AG:auth_Passwort>
</GET-AG:rec>
<GET-AG:plz>69126</GET-AG:plz>
</GET-AG:getOrteByPlz>
</soapenv:Body>
</soapenv:Envelope>"
);
using (Stream stream = request.GetRequestStream())
{
soapEnvelopeXml.Save(stream);
}
using (WebResponse response = request.GetResponse())
{
using (StreamReader rd = new StreamReader(response.GetResponseStream()))
{
string soapResult = rd.ReadToEnd();
Console.WriteLine(soapResult);
}
}
}
/// <summary>
/// Create a soap webrequest to [Url]
/// </summary>
/// <returns></returns>
public static HttpWebRequest CreateWebRequest()
{
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(@"----------");
webRequest.Headers.Add(@"SOAP:Action");
webRequest.ContentType = "text/xml;charset=\"utf-8\"";
webRequest.Accept = "text/xml";
webRequest.Method = "POST";
return webRequest;
}
static void Main(string[] args)
{
Execute();
}
这是XML:
<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns:getOrteByPlzResponse xmlns:ns="----------">
<ns:return xmlns:ax215="----------" xmlns:ax213="----------" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ax213:Adressinfo">
<ax213:fehlerCode>1</ax213:fehlerCode>
<ax213:fehlerMeldungLength>0</ax213:fehlerMeldungLength>
<ax213:input xsi:type="ax213:AdressinfoParameter">
<ax213:strassenRequest xsi:nil="true"/>
<ax213:stringRequest>69126</ax213:stringRequest>
<ax213:validationsRequest xsi:nil="true"/>
</ax213:input>
<ax213:itag>BPTest1;;26.04.2019,15:16:21</ax213:itag>
<ax213:ort xsi:type="ax213:Ort">
<ax213:alort>22810500</ax213:alort>
<ax213:gkz>08221000</ax213:gkz>
<ax213:ortsname>Heidelberg</ax213:ortsname>
<ax213:ortsteil>Boxberg</ax213:ortsteil>
<ax213:ortsteil>Emmertsgrund</ax213:ortsteil>
<ax213:ortsteil>Rohrbach</ax213:ortsteil>
<ax213:ortsteil>Südstadt</ax213:ortsteil>
<ax213:ortsteilLength>4</ax213:ortsteilLength>
<ax213:plzLength>0</ax213:plzLength>
</ax213:ort>
<ax213:ortLength>1</ax213:ortLength>
<ax213:strasseLength>0</ax213:strasseLength>
<ax213:validation xsi:nil="true"/>
</ns:return>
</ns:getOrteByPlzResponse>
</soapenv:Body>
</soapenv:Envelope>
答案 0 :(得分:1)
为了方便快捷地访问值,您可以使用XmlReader
来读取SOAP响应,以从每个LocalName
中找到Value
/ XmlElement
映射,然后存储会产生NameValueCollection
(或您可能更喜欢的ICollection
):
public static void Main()
{
string strResponse = "<?xml version=\'1.0\' encoding=\'UTF-8\'?>\r\n<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">\r\n <soapenv:Body>\r\n <ns:getOrteByPlzResponse xmlns:ns=\"----------\">\r\n <ns:return xmlns:ax215=\"----------\" xmlns:ax213=\"----------\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"ax213:Adressinfo\">\r\n <ax213:fehlerCode>1</ax213:fehlerCode>\r\n <ax213:fehlerMeldungLength>0</ax213:fehlerMeldungLength>\r\n <ax213:input xsi:type=\"ax213:AdressinfoParameter\">\r\n <ax213:strassenRequest xsi:nil=\"true\"/>\r\n <ax213:stringRequest>69126</ax213:stringRequest>\r\n <ax213:validationsRequest xsi:nil=\"true\"/>\r\n </ax213:input>\r\n <ax213:itag>BPTest1;;26.04.2019,15:16:21</ax213:itag>\r\n <ax213:ort xsi:type=\"ax213:Ort\">\r\n <ax213:alort>22810500</ax213:alort>\r\n <ax213:gkz>08221000</ax213:gkz>\r\n <ax213:ortsname>Heidelberg</ax213:ortsname>\r\n <ax213:ortsteil>Boxberg</ax213:ortsteil>\r\n <ax213:ortsteil>Emmertsgrund</ax213:ortsteil>\r\n <ax213:ortsteil>Rohrbach</ax213:ortsteil>\r\n <ax213:ortsteil>Südstadt</ax213:ortsteil>\r\n <ax213:ortsteilLength>4</ax213:ortsteilLength>\r\n <ax213:plzLength>0</ax213:plzLength>\r\n </ax213:ort>\r\n <ax213:ortLength>1</ax213:ortLength>\r\n <ax213:strasseLength>0</ax213:strasseLength>\r\n <ax213:validation xsi:nil=\"true\"/>\r\n </ns:return>\r\n </ns:getOrteByPlzResponse>\r\n </soapenv:Body>\r\n</soapenv:Envelope>";
NameValueCollection nameValueCollection = new NameValueCollection();
try
{
using (StringReader stringReader = new StringReader(strResponse))
{
using (XmlReader xmlReader = XmlReader.Create(stringReader, new XmlReaderSettings()))
{
xmlReader.MoveToContent();
string strKeyValue = null;
do
{
switch (xmlReader.NodeType)
{
case XmlNodeType.Text:
strKeyValue = xmlReader.Value;
break;
case XmlNodeType.EndElement:
if (!string.IsNullOrEmpty(strKeyValue))
{
nameValueCollection.Add(xmlReader.LocalName, strKeyValue);
}
break;
default:
strKeyValue = null;
break;
}
} while (xmlReader.Read());
}
}
}
catch (Exception parentException)
{
Console.WriteLine(parentException);
}
}
要获取任何XmlElement
的字符串值,您需要通过已知键(无命名空间前缀)访问NameValueCollection
。例如:
nameValueCollection["fehlerCode"]
AllKeys
和值的示例输出:
Console.Write(string.Join(Environment.NewLine, nameValueCollection.AllKeys.Select(x => x + ": " + nameValueCollection[x])));
fehlerCode: 1
fehlerMeldungLength: 0
stringRequest: 69126
itag: BPTest1;;26.04.2019,15:16:21
alort: 22810500
gkz: 08221000
ortsname: Heidelberg
ortsteil: Boxberg,Emmertsgrund,Rohrbach,Südstadt
ortsteilLength: 4
plzLength: 0
ortLength: 1
strasseLength: 0
答案 1 :(得分:0)
下面的代码可以很好地打印出所有内容
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;
namespace ConsoleApplication110
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
XElement rtn = doc.Descendants().Where(x => x.Name.LocalName == "return").FirstOrDefault();
string output = "";
foreach (XElement child in rtn.Descendants())
{
string name = child.Name.LocalName;
if (name.Contains("validation"))
{
string nil = child.Attributes().First().Value;
output = name + " : " + nil;
}
else
{
output = name + " : " + (string)child;
}
Console.WriteLine(output);
}
Console.ReadLine();
}
}
}