我需要能够使用如下模式操作XML:
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<SOAP-ENVELOPE:Envelope xmlns:SOAP-ENVELOPE='http://schemas.xmlsoap.org/soap/envelope/'>
<SOAP-ENVELOPE:Header>
<Authorization>
<FromURI/>
<User/>
<Password/>
<TimeStamp/>
</Authorization>
<Notification>
<NotificationURL/>
<NotificationExpiration/>
<NotificationID/>
<MustNotify/>
</Notification>
</SOAP-ENVELOPE:Header>
<SOAP-ENVELOPE:Body SOAP-ENVELOPE:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'>
</SOAP-ENVELOPE:Body>
我需要为FromURI,User,Password,NotificiationURL,MustNotify等添加数据,并在我需要动态添加的正文中:
<SOAPSDK4:APIOperation xmlns:SOAPSDK4="http://www.someserver.com/message/">
</SOAPSDK4:APIOperation>
最终在APIOperation中构建Web服务所需的结构,但可以使用XDocument轻松完成创建树。
我一直在查找有关如何操作信封内数据的一周信息,这里我需要使用不同级别的树。
答案 0 :(得分:1)
给你一个想法:
var doc = XDocument.Load(...);
XNamespace envNs = "http://schemas.xmlsoap.org/soap/envelope/";
var fromUri = doc.Root
.Element(envNs + "Header")
.Element("Authorization")
.Element("FromURI");
fromUri.Value = "http://trst";
doc.Save(...);
答案 1 :(得分:1)
最后我决定使用XmlDocument从头创建它:
XmlDocument Request = new XmlDocument();
XmlDeclaration declarationRequest = Request.CreateXmlDeclaration("1.0", "UTF-8", "no");
Request.InsertBefore(declaracionRequest, Request.DocumentElement);
XmlElement soapEnvelope = Request.CreateElement("SOAP-ENVELOPE", "Envelope", "http://schemas.xmlsoap.org/soap/envelope/");
Request.AppendChild(soapEnvelope);
XmlElement soapHeader = Request.CreateElement("SOAP-ENVELOPE", "Header", Request.DocumentElement.NamespaceURI);
Request.DocumentElement.AppendChild(soapHeader);
XmlElement soapBody = Request.CreateElement("SOAP-ENVELOPE", "Body", Request.DocumentElement.NamespaceURI);
soapBody.SetAttribute("SOAP-ENVELOPE:encodingStyle", "http://schemas.xmlsoap.org/soap/encoding/");
Request.DocumentElement.AppendChild(soapBody);
XmlElement nodeAutorization = Request.CreateElement("Authorization");
XmlElement nodeFromURI = Request.CreateElement("FromURI");
...
soapHeader.AppendChild(nodoAutorization);
nodeAutorization.AppendChild(nodoFromURI);
nodeAutorization.AppendChild(nodoUser);
...
并以同样的方式处理其他事情。问题是,代码使用所有元素变得非常大,并且难以在同一级别生成许多节点。
我不知道是否有更好的做法或更简单的事情,但这有效。
答案 2 :(得分:0)
如果我正确理解您的问题,您可以使用StringBuilder
创建SOAP信封,然后将该字符串转换为XDocument
。