C#使用名称空间前缀写入XElement但不包括在Root元素中的名称

时间:2017-03-23 10:13:22

标签: c# xml linq-to-xml xml-namespaces xmlwriter

供参考参见: 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的一部分,它包含ci和ca的自己的命名空间引用。现在“<myrootelement>”通过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 个答案:

答案 0 :(得分:0)

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

或许这个问题只是一个XY problem,因为插入不符合XML规范的字符串,你打算在下一步中做,也可能会有问题,假设你还在使用一些用于此任务的XML API。