【问题标题】:Add xsi:type to my XML document将 xsi:type 添加到我的 XML 文档
【发布时间】:2016-05-22 23:58:20
【问题描述】:

我有一段代码可以使用这种 Web 服务方法提取 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());

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

<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>

但我真正需要的是这个:

<ranzcp_user xmlns:ns1="urn:logon">
    <user_id  xsi:type="xsd:string">12345678</user_id>
</ranzcp_user>  

有什么方法可以得到我需要的 xml 格式,第二个 xsi:type="xsd:string" 属性在解析 xml 数据时是否必要?

TIA!

【问题讨论】:

  • 为什么要删除命名空间?你有错误吗?谁在生成 xml?如果使用模式的命名空间出现错误,则 xml 无效,需要修复。删除命名空间是个杂事。
  • @under_score xsi:type 没有声明 xsi 前缀 (xmlns:xsi="...") 会导致不符合 XML 规范的内容(因此不符合 XML 的条件,反过来可以'不被标准 XML 解析器生成/处理)
  • 同意@har07。有关详细信息,请参阅How to restrict the value of an XML element using xsi:type in XSD?
  • 感谢所有输入,现在它只是我需要从我的 Web 服务返回的 XML 的规范,只是不知道一旦我把它交给他们,对方将如何解析它

标签: c# xml web-services


【解决方案1】:

您可以显式定义命名空间前缀,以便使用规范的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 无效 - 没有符合要求的处理器允许您创建或读取它而不会出错。

可能是“必需的”XML 在其中一个父元素中声明了此前缀吗?如果不是,我建议这是一个错误,您应该在花时间尝试删除该属性之前对此进行调查。我怀疑当消费者发现 XML 无效时,您最终会撤消所有这些努力。

【讨论】:

  • Charles Mager:这个现在就可以了,是的,我正在处理这个任务的旧文档,也许我现在只需要放入这个 XML 模板,看看他们是如何进行的,谢谢寻求帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 2015-10-08
  • 2022-07-23
相关资源
最近更新 更多