将xsi:type添加到我的XML文档中

时间:2016-05-22 23:58:21

标签: c# xml web-services

我有一个使用此Web服务方法提取XML文档类型的代码

ServletContextListener

使用上面的代码,我能够提取一个完全像这样的xml文档:

XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
XAttribute attribute = new XAttribute(xsi + "type", "xsd:string");

XElement node_user_id = new XElement("user_id", attribute, user.code);

XDocument doc = new XDocument(new XElement("ranzcp_user", new XAttribute(XNamespace.Xmlns + "ns1", "urn:logon"), node_user_id));

 XmlDocument xmldoc = new XmlDocument();
 xmldoc.LoadXml(elem.ToString());

但我真正需要的是:

<ranzcp_user xmlns:ns1="urn:logon">
   <user_id xmlns:p3="http://www.w3.org/2001/XMLSchema-instance" p3:type="xsd:string">12345678</user_id>
</ranzcp_user>

有没有什么方法可以获得我需要的xml格式,第二次在解析xml数据时是否需要xsi:type =“xsd:string”属性?

TIA!

1 个答案:

答案 0 :(得分:3)

您可以明确定义名称空间前缀,以便使用规范xsi而不是p3

var doc = new XDocument(
    new XElement("ranzcp_user",
        new XAttribute(XNamespace.Xmlns + "ns1", "urn:logon"),
        new XAttribute(XNamespace.Xmlns + "xsi", xsi),
        new XElement("user_id", 12345678,
            new XAttribute(xsi + "type", "xsd:string")
            )
        )
    );

this fiddle。这给你:

<ranzcp_user xmlns:ns1="urn:logon" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <user_id xsi:type="xsd:string">12345678</user_id>
</ranzcp_user>

但是,正如已经说过的那样,删除命名空间前缀完全会导致XML无效 - 没有符合标准的处理器可以让你创建或读取它而没有错误。

可能是'required'XML在其中一个父元素中声明了这个前缀吗?如果没有,我建议这是一个错误,您应该在花时间尝试删除属性之前进行调查。我怀疑当消费者解决XML无效时,你最终会撤消所有这些努力。