将XML文档转换为HTTP编码的URL编码查询字符串 - C#

时间:2010-11-05 11:01:16

标签: c# xml encode

我发布到一个网页,我被告知将XML作为它的正文。事实证明它真正需要的是看起来像URL编码的CGI查询字符串:

<FIRST>
  <ELEMENT1>Value1</ELEMENT1>
  <ELEMENT2>Value1</ELEMENT2>
  <ELEMENT3>Value1</ELEMENT3>
</FIRST>

<SECOND>
  <ELEMENT1>Value1</ELEMENT1>
  <ELEMENT2>Value1</ELEMENT2>
</SECOND>

需要传输

FIRST_ELEMENT1 = VALUE1&安培; FIRST_ELEMENT2 = VALUE2&安培; FIRST_ELEMENT3 = VALUE3&安培; SECOND_ELEMENT1 = VALUE1&安培; SECOND_ELEMENT2 = VALUE2

第三方告诉我这是一种常见的用法,虽然我之前没有看到它(作为提交XML的方法),很明显该服务旨在采用带有表单作为数据源的HTML POST

虽然我可以看到如何编写转换,但我想知道.Net框架中是否有一个实现此转换的方法。此项目可以使用.Net 3.5。

提前致谢 戴夫

3 个答案:

答案 0 :(得分:3)

永远不会看到这种用法,但有点像:

var query = string.Join("&",(
            from parent in XElement.Parse(xml).Elements()
            from child in parent.Elements()
            select HttpUtility.UrlEncode(parent.Name.LocalName) + "_"
                 + HttpUtility.UrlEncode(child.Name.LocalName) + "="
                 + HttpUtility.UrlEncode(child.Value)).ToArray());

答案 1 :(得分:1)

我强烈怀疑是否有内置功能来实现这一目标,但编写代码并不难。我将使用一个递归方法来检查节点的子节点,使用表示树中节点位置的字符串前缀来调用自身。在方法之外维护列表或字典或任何最适合您的需求,当您遇到带有文本数据的节点时,将前缀+标记和值附加到列表中。然后,通过该列表并以查询字符串格式加入它们将是微不足道的。但要注意逃避&符号和其他保留字符。

答案 2 :(得分:0)

这看起来很疯狂,我希望你的XML数据不是很长......如果查询字符串结束时间很长,你可能会遇到问题。

我不明白为什么你不能做HTTP-POST,将content-type设置为'text / xml',只是发布原始XML数据。