【问题标题】:Creating XDocument with XNamespaces使用 XNamespaces 创建 XDocument
【发布时间】:2014-01-13 14:19:43
【问题描述】:

首先我想向您展示我生成的 XML 的样子:

<env:Envelope xmlns:env="http://www.sap.com/SBO/DIS">
  <env:Body>
    <dis:ExecuteSQLResponse xmlns:dis="http://www.sap.com/SBO/DIS">
      <BOM>
        <BO>
          <AdmInfo>
            <Object>oRecordset</Object>
          </AdmInfo>
          <Table />
        </BO>
      </BOM>
    </ExecuteSQLResponse>
  </env:Body>
</env:Envelope>

它应该是什么样子:

<env:Envelope xmlns:env="http://www.sap.com/SBO/DIS">
  <env:Body>
    <ExecuteSQLResponse xmlns="http://www.sap.com/SBO/DIS">
      <BOM>
        <BO>
          <AdmInfo>
            <Object>oRecordset</Object>
          </AdmInfo>
          <Table />
        </BO>
      </BOM>
    </ExecuteSQLResponse>
  </env:Body>
</env:Envelope>

我使用以下代码来创建 XML:

resXml.Add(New XElement(env + "Envelope",
                                            New XAttribute(XNamespace.Xmlns + "env", env.NamespaceName),
                               New XElement(env + "Body",
                               New XElement(dis + "ExecuteSQLResponse",
                                            New XAttribute(XNamespace.Xmlns + "dis", dis.NamespaceName),
                               New XElement("BOM",
                               New XElement("BO",
                               New XElement("AdmInfo",
                               New XElement("Object", "oRecordset")),
                               New XElement("Table")))))))

这是一些 vb.net 代码,但在 c# 中应该是相同的

我的问题是尝试和尝试后的“dis:ExecuteSQLResponse”我无法弄清楚如何在 ExecuteSQLResponse 之前删除“dis”。 我的意思是命名空间很好..它应该看起来像这样: "ExecuteSQLResponse xmlns="http://www.sap.com/SBO/DIS"" 没有“dis”

我的 XNamespace 定义:

Dim env As XNamespace = XNamespace.Get("http://www.w3.org/2003/05/soap-envelope")
Dim dis As XNamespace = XNamespace.Get("http://www.sap.com/SBO/DIS")

【问题讨论】:

  • 为什么你认为前缀很重要?它不会(或者至少不应该)。
  • 这取决于程序处理 XML 的方式,如果没有像我需要的那样获取我的 XML,我必须在业务逻辑上做出巨大的改变(是的,可能不是最干净和最好的 BL)跨度>
  • 如果程序关心前缀,那么它就被严重破坏了。这不是 XML 的工作方式。是否可能进行字符串操作而不是 XML 操作?前缀是“dis”、“abc”还是空都无关紧要。
  • 哦哇..我认为你是对的。在解决 NS 问题时,我对其余部分视而不见。对此感到抱歉。谢谢你让我大开眼界:)

标签: .net xml vb.net linq-to-xml


【解决方案1】:

只需更改这部分:

New XElement(dis + "ExecuteSQLResponse", '->which correspond to dis:ExecuteSQLResponse

到这里:

New XElement("ExecuteSQLResponse", '->which correspond to ExecuteSQLResponse

【讨论】:

  • 抱歉,这不是解决方案。如果我这样做,我的结果将如下所示:“ExecuteSQLResponse”而不是我需要它:“ExecuteSQLResponse xmlns="sap.com/SBO/DIS"
  • 你试过了吗?你有这部分:New XAttribute(XNamespace.Xmlns + "dis", dis.NamespaceName) 添加 xmlns 属性。它应该输出你需要的:带有 xmlns 属性的标签,没有 dis 前缀。我在 C# 中试过这个。
  • 好的,我只是注意到这解决了一部分,但留下了前缀xmlns:dis
  • 感谢我的问题解决了(如果你喜欢检查上面的 cmets)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多