Манипулировать XML XDocument XmlDocument C # - PullRequest
0 голосов
/ 10 августа 2011

Мне нужно иметь возможность манипулировать 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, Пользователь, Пароль, NotificiationURL, MustNotify,и т. д. и в теле, которое мне необходимо добавить динамически:

<SOAPSDK4:APIOperation xmlns:SOAPSDK4="http://www.someserver.com/message/">
</SOAPSDK4:APIOperation>

Чтобы окончательно построить структуру в APIOperation, которая необходима для веб-службы, но это легко сделать с помощью XDocument для создания дерева.

У меня были проблемы с поиском информации в течение недели о том, как манипулировать данными в конверте, и здесь мне нужно сделать это с разными уровнями дерева.

Ответы [ 3 ]

1 голос
/ 10 августа 2011

Чтобы дать вам представление:

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 голос
/ 12 августа 2011

Наконец я решил создать его с нуля, используя 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);
...

И так же, как и все остальное.Проблема в том, что код становится довольно большим, используя все элементы, и довольно сложно генерировать множество узлов на одном уровне.

Я не знаю, есть ли лучшие практики или что-то более простое, но это сработало.

0 голосов
/ 10 августа 2011

Если я правильно понимаю ваш вопрос, вы можете просто использовать StringBuilder для создания конверта SOAP, а затем преобразовать эту строку в XDocument.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...