我有一个使用此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!
答案 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无效时,你最终会撤消所有这些努力。