繁体   English   中英

从SOAP消息中删除名称空间

[英]Remove namespace from SOAP message

我有个问题..

这是我必须传递给某些方法的XML文档。

<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP:Header/>
<SOAP:Body>
<BATMAS03>
<IDOC BEGIN="1">
<EDI_DC40 SEGMENT="1">
<TABNAM>EDI_DC40</TABNAM>
<MANDT>310</MANDT>
<DOCNUM>0000000000006284</DOCNUM>
<DOCREL>740</DOCREL>
<STATUS>30</STATUS>
<DIRECT>1</DIRECT>
<OUTMOD>2</OUTMOD>
<IDOCTYP>BATMAS03</IDOCTYP>
<MESTYP>BATMAS</MESTYP>
<STDMES>BATMAS</STDMES>
<SNDPOR>SAPDVJ</SNDPOR>
<SNDPRT>LS</SNDPRT>
<SNDPRN>DVJCLNT310</SNDPRN>
<RCVPOR>XML</RCVPOR>
<RCVPRT>LS</RCVPRT>
<RCVPRN>DXTCLNT330</RCVPRN>
<CREDAT>20150902</CREDAT>
<CRETIM>193043</CRETIM>
</EDI_DC40>
<E1BATMAS SEGMENT="1">
<MATERIAL>000000000000501104</MATERIAL>
<BATCH>150715L01</BATCH>
<E1BPBATCHCTRL SEGMENT="1">
<DOCLASSIFY>X</DOCLASSIFY>
</E1BPBATCHCTRL>
<E1BP3060_ALLOCATION SEGMENT="1">
<CLASS_TYPE>023</CLASS_TYPE>
<OBJECTKEY>000000000000501104150715L01</OBJECTKEY>
<OBJECTTABLE>MCH1</OBJECTTABLE>
<CLOBJECTKEY>Z_PROIZVOD</CLOBJECTKEY>
<CLASSNUM>Z_PROIZVOD</CLASSNUM>
<CLASSTYPE>023</CLASSTYPE>
</E1BP3060_ALLOCATION>
<E1BP3060_VALUATION_CHAR SEGMENT="1">
<CLASS_TYPE>023</CLASS_TYPE>
<OBJECTKEY>000000000000501104150715L01</OBJECTKEY>
<OBJECTTABLE>MCH1</OBJECTTABLE>
<CLOBJECTKEY>Z_PROIZVOD</CLOBJECTKEY>
<CHARACT>Z_EDICIJA</CHARACT>
<VALUE_CHAR>V001</VALUE_CHAR>
</E1BP3060_VALUATION_CHAR>
</E1BATMAS>
</IDOC>
</BATMAS03>
</SOAP:Body>
</SOAP:Envelope>

首先,我将其转换为这样的字符串

 StringWriter sw = new StringWriter();
 XmlTextWriter xw = new XmlTextWriter(sw);
 XmlDoc.WriteTo(xw);
 string str = sw.ToString();

然后,我将该字符串传递给方法。问题是,我希望在没有SOAP decleration的情况下删除或传递该字符串;

<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP:Header/>
<SOAP:Body>

这是我想作为字符串传递的内容:

<BATMAS03>
<IDOC BEGIN="1">
<EDI_DC40 SEGMENT="1">
<TABNAM>EDI_DC40</TABNAM>
<MANDT>310</MANDT>
<DOCNUM>0000000000006284</DOCNUM>
<DOCREL>740</DOCREL>
<STATUS>30</STATUS>
<DIRECT>1</DIRECT>
<OUTMOD>2</OUTMOD>
<IDOCTYP>BATMAS03</IDOCTYP>
<MESTYP>BATMAS</MESTYP>
<STDMES>BATMAS</STDMES>
<SNDPOR>SAPDVJ</SNDPOR>
<SNDPRT>LS</SNDPRT>
<SNDPRN>DVJCLNT310</SNDPRN>
<RCVPOR>XML</RCVPOR>
<RCVPRT>LS</RCVPRT>
<RCVPRN>DXTCLNT330</RCVPRN>
<CREDAT>20150902</CREDAT>
<CRETIM>193043</CRETIM>
</EDI_DC40>
<E1BATMAS SEGMENT="1">
<MATERIAL>000000000000501104</MATERIAL>
<BATCH>150715L01</BATCH>
<E1BPBATCHCTRL SEGMENT="1">
<DOCLASSIFY>X</DOCLASSIFY>
</E1BPBATCHCTRL>
<E1BP3060_ALLOCATION SEGMENT="1">
<CLASS_TYPE>023</CLASS_TYPE>
<OBJECTKEY>000000000000501104150715L01</OBJECTKEY>
<OBJECTTABLE>MCH1</OBJECTTABLE>
<CLOBJECTKEY>Z_PROIZVOD</CLOBJECTKEY>
<CLASSNUM>Z_PROIZVOD</CLASSNUM>
<CLASSTYPE>023</CLASSTYPE>
</E1BP3060_ALLOCATION>
<E1BP3060_VALUATION_CHAR SEGMENT="1">
<CLASS_TYPE>023</CLASS_TYPE>
<OBJECTKEY>000000000000501104150715L01</OBJECTKEY>
<OBJECTTABLE>MCH1</OBJECTTABLE>
<CLOBJECTKEY>Z_PROIZVOD</CLOBJECTKEY>
<CHARACT>Z_EDICIJA</CHARACT>
<VALUE_CHAR>V001</VALUE_CHAR>
</E1BP3060_VALUATION_CHAR>
</E1BATMAS>
</IDOC>
</BATMAS03>

这有可能吗? 谢谢!

这应该创建没有名称空间的myObject。

XmlDocument myObject = new XmlDocument();
using (XmlTextReader tr = new XmlTextReader(xmlFilepath))
{
    tr.Namespaces = false;
    myObject.Load(tr);
}

我已经尝试过使用相同的方法来创建对象并处理以删除一些不需要的节点,然后将其写入另一个文件。

抱歉,我没有正确阅读,我以为您只对删除名称空间感兴趣。 这是您需要与以前的代码一起使用的更新

//this assumes your SOAP:Body is a well known tag
//else you may wish to make it a bit generic
XmlNodeList nodeList = myObject.GetElementsByTagName("SOAP:Body");
if (nodeList.Item(0)!= null)
{
    XmlNode item = nodeList.Item(0);
    if (item != null)
    File.WriteAllText("TestOutput.xml", item.InnerXml);
}

这给出了您需要的输出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM