C#用命名空间前缀编写XElement,但不包括根元素中的前缀

Posted

技术标签:

【中文标题】C#用命名空间前缀编写XElement,但不包括根元素中的前缀【英文标题】:C# Write XElement with namespace prefix but not including that in Root element 【发布时间】:2017-03-23 10:13:22 【问题描述】:

参考见: This Question

上面的要求是写

<root xmlns:ci="http://somewhere.com" xmlns:ca="http://somewhereelse.com">
    <ci:field1>test</ci:field1>
    <ca:field2>another test</ca:field2>
</root>

这里给出了代码

但我的要求是写

<myrootelement>
    <ci:field1>test</ci:field1>
    <ca:field2 ca:attrb1="value">another test</ca:field2>
</myrootelement>

因为这个元素将成为另一个大型 XML 的一部分,该 XML 包含自己的 ci 和 ca 命名空间引用。现在“&lt;myrootelement&gt;”作为子元素通过 api 插入到特定的 XElement,所以我无法访问 XSD 或命名空间等。

我尝试了什么

            XElement element = new XElement("myrootelement",
                new XElement(ci + "field1", "test"),
                new XElement(ca + "field2", "another test", new XAttribute(ca + "attrb1", "value")));

但这会产生:

<myrootelement>
    <field1 xmlns="http://somewhere.com">test</field1>
    <field2 p2:attrb1="value" xmlns:p2="http://somewhereelse.com" xmlns="http://somewhereelse.com">another test</field2>
</myrootelement>

编辑:添加更多细节

然后使用

将上述元素发送到 Rest API

.
.
var client = new RestClient(uri);
var request = new RestRequest(Method.POST);
request.AddHeader("cache-control", "no-cache");
request.AddParameter("text/xml", elem, ParameterType.RequestBody);
.
.

【问题讨论】:

【参考方案1】:

您尝试生成的不是 XML,因为它不符合 XML 规范,因此不要指望诸如 LINQ-to-XML 之类的 XML API 可以为你。您最好的选择可能是生成一个正确的 XML,其中包括名称空间定义(如果此时您没有该信息,可能使用假 URI),然后执行一些字符串操作操作(正则表达式或简单的 String.Replace())之后删除这些命名空间。

或者这个问题可能只是一个XY problem,因为插入不符合 XML 规范的字符串(您打算在下一步中执行)也可能有问题,假设您仍在使用某种此任务的 XML API。

【讨论】:

0。是的,我知道,我尝试生成的元素标记不是有效的 XML - 仅当您将 &lt;myrootelement&gt; 视为文档的 时。 1. 但是,如果您看到,它是更大 xml 的有效子树,因为更大的 XML 具有所有命名空间引用。 我知道这一点,正如问题中提到的那样。但目前,您正在尝试单独创建 XElement。在您的代码中没有提到更大的 XML,因此它无法知道该元素应该是任何其他 XML 的一部分 如果您正确地将XElement(不是它的字符串表示)添加到您提到的更大的XML,您的代码应该可以工作,即命名空间声明不会添加到myrootelement: dotnetfiddle.net/U5LHep 很抱歉没有说得足够清楚,但是 XElement 是使用 RestSharp POST 调用发送到 REST API 的——这就是我说我对更大的 XML 不清楚的原因。但是举个例子,假设我有关于更大 XML 的信息,我无法访问它以在其末尾发布我的元素。要么我需要让对方的开发人员给我另一种方法来在他们的系统中插入 XElement,或者有一种我还不知道的方法

以上是关于C#用命名空间前缀编写XElement,但不包括根元素中的前缀的主要内容,如果未能解决你的问题,请参考以下文章

删除带有命名空间前缀的 xmlns 属性

将命名空间添加到根元素

将命名空间前缀添加到根节点

C#:如何从 XElement 中获取名称(带前缀)作为字符串?

JAXB:需要所有元素的命名空间前缀

C# - 如何从 XElement 中删除 xmlns