无法使用 WSDL 和转义字符传递 XML
Can't pass XML using WSDL and escaping characters
我真的很难找到一种方法来传递 XML 字符串而不转义 C# 中的字符。我在下面有一个字符串需要作为字符串传递到对 WSDL 的调用中。
<MyElement ElementId='xxxxxx'><Segments><Segment Status='1' SegmentId='xx1'/><Segment Status='1'
SegmentId='xx2'/></Segments></MyElement>
如果我尝试将字符串传递给它,则字符是转义字符,例如“>”。我在 .NET 控制台应用程序中导入了 WSDL。这是我在 chrome.
中使用 Wizdler 工具看到的上面字符串的内容
整个消息是这样的。
所以我的问题是如何在 C# 中使用 WSDL,甚至只是手动执行调用以完成这项工作
using (var client = new MemberService.MemberWebServiceSoapClient())
{
var xml = "<MyElement ElementId='xxxxxxx'><Segments><Segment Status='1' SegmentId='xx1'/><Segment
Status='1' SegmentId='xx2'/></Segments></MyElement>"
var send = client.Moving(xml);
}
使用 Xml Linq :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
string envelope = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<Envelope xmlns=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
"<Body>" +
"<Moving xmlns=\"http://www.retalix.com/HQLWebServices\">" +
"</Moving>" +
"</Body>" +
"</Envelope>";
XDocument doc = XDocument.Parse(envelope);
XElement moving = doc.Descendants().Where(x => x.Name.LocalName == "Moving").FirstOrDefault();
XNamespace ns = moving.GetDefaultNamespace();
string elementId = "xxxxxx";
List<Segment> segments = new List<Segment>() {
new Segment() { id = "xx1", status = 1},
new Segment() { id = "xx2", status = 1}
};
XElement xMyElement = new XElement(ns + "MyElement", new XAttribute("ElementId", elementId));
moving.Add(xMyElement);
XElement xSegments = new XElement(ns + "Segments");
xMyElement.Add(xSegments);
foreach (Segment segment in segments)
{
XElement xSegment = new XElement("Segment", new object[] {
new XAttribute("Status", segment.status),
new XAttribute("SegmentId", segment.id)
});
xSegments.Add(xSegment);
}
string sendXml = doc.ToString();
}
}
public class Segment
{
public string id { get; set; }
public int status { get; set; }
}
}
我真的很难找到一种方法来传递 XML 字符串而不转义 C# 中的字符。我在下面有一个字符串需要作为字符串传递到对 WSDL 的调用中。
<MyElement ElementId='xxxxxx'><Segments><Segment Status='1' SegmentId='xx1'/><Segment Status='1'
SegmentId='xx2'/></Segments></MyElement>
如果我尝试将字符串传递给它,则字符是转义字符,例如“>”。我在 .NET 控制台应用程序中导入了 WSDL。这是我在 chrome.
中使用 Wizdler 工具看到的上面字符串的内容整个消息是这样的。
所以我的问题是如何在 C# 中使用 WSDL,甚至只是手动执行调用以完成这项工作
using (var client = new MemberService.MemberWebServiceSoapClient())
{
var xml = "<MyElement ElementId='xxxxxxx'><Segments><Segment Status='1' SegmentId='xx1'/><Segment
Status='1' SegmentId='xx2'/></Segments></MyElement>"
var send = client.Moving(xml);
}
使用 Xml Linq :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
string envelope = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<Envelope xmlns=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
"<Body>" +
"<Moving xmlns=\"http://www.retalix.com/HQLWebServices\">" +
"</Moving>" +
"</Body>" +
"</Envelope>";
XDocument doc = XDocument.Parse(envelope);
XElement moving = doc.Descendants().Where(x => x.Name.LocalName == "Moving").FirstOrDefault();
XNamespace ns = moving.GetDefaultNamespace();
string elementId = "xxxxxx";
List<Segment> segments = new List<Segment>() {
new Segment() { id = "xx1", status = 1},
new Segment() { id = "xx2", status = 1}
};
XElement xMyElement = new XElement(ns + "MyElement", new XAttribute("ElementId", elementId));
moving.Add(xMyElement);
XElement xSegments = new XElement(ns + "Segments");
xMyElement.Add(xSegments);
foreach (Segment segment in segments)
{
XElement xSegment = new XElement("Segment", new object[] {
new XAttribute("Status", segment.status),
new XAttribute("SegmentId", segment.id)
});
xSegments.Add(xSegment);
}
string sendXml = doc.ToString();
}
}
public class Segment
{
public string id { get; set; }
public int status { get; set; }
}
}