如何忽略 xml 命名空间?

发布于 2024-12-09 10:38:56 字数 610 浏览 1 评论 0原文

我有一个测试 xml 文件,如下所示:

<Person>
  <ContactInfo>
   ...
  <ContactInfo>
</Person>

当我尝试反序列化时,一切正常。 但问题是,有时这个 xml 文件的结构是不同的——有时会添加 xml 命名空间。

<Person xmlns:xsd="http://www.w3.org/2001/XMLSchema"    
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
  <ContactInfo>
   ...
  <ContactInfo>
</Person>

现在,当我进行序列化时,我收到 IOnvalidOperationException:“XML 文档 (1, 2) 中存在错误”。内部异常消息显示 不是预期的。

那么有人可以帮我解决这个问题吗?

I've got test xml file that looks like this:

<Person>
  <ContactInfo>
   ...
  <ContactInfo>
</Person>

When I'm trying to deserialize, everything works fine.
But the problem is that sometimes the structure of this xml file is different - xml namespaces are added sometimes.

<Person xmlns:xsd="http://www.w3.org/2001/XMLSchema"    
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
  <ContactInfo>
   ...
  <ContactInfo>
</Person>

And now when I'm serializing, I get IOnvalidOperationException: "There is an error in XML document (1, 2)". The inner exception message says <Person xmlns='http://tempuri.org/PaymentInformationXml.xsd'> was not expected.

So could anyone help me with this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

瑾兮 2024-12-16 10:38:56

命名空间是 XML 中的基础(与可互换的命名空间不同)。如果 Person 在该命名空间中,您必须告诉它:

[XmlRoot(Namespace="http://tempuri.org/PaymentInformationXml.xsd")]
public class Person {...}

A namespace is fundamental in XML (unlike namespaces which are interchangeable). If Person is in that namespace, you must tell it:

[XmlRoot(Namespace="http://tempuri.org/PaymentInformationXml.xsd")]
public class Person {...}
沧桑㈠ 2024-12-16 10:38:56

有一篇关于 xml 的文章 这里

我也偶然发现了 accros这段代码:(非常有帮助)

XmlDocument stripDocumentNamespace(XmlDocument oldDom)
{
// Remove all xmlns:* instances from the passed XmlDocument
// to simplify our xpath expressions.
XmlDocument newDom = new XmlDocument();
newDom.LoadXml(System.Text.RegularExpressions.Regex.Replace(
oldDom.OuterXml, @"(xmlns:?[^=]*=[""][^""]*[""])", "",
System.Text.RegularExpressions.RegexOptions.IgnoreCase | System.Text.RegularExpressions.RegexOptions.Multiline)
);
return newDom;
} 

希望这能有所帮助

there's an article about xml here

And i also stumbled accros this piece of code: (very helpfull)

XmlDocument stripDocumentNamespace(XmlDocument oldDom)
{
// Remove all xmlns:* instances from the passed XmlDocument
// to simplify our xpath expressions.
XmlDocument newDom = new XmlDocument();
newDom.LoadXml(System.Text.RegularExpressions.Regex.Replace(
oldDom.OuterXml, @"(xmlns:?[^=]*=[""][^""]*[""])", "",
System.Text.RegularExpressions.RegexOptions.IgnoreCase | System.Text.RegularExpressions.RegexOptions.Multiline)
);
return newDom;
} 

hope this could help

一世旳自豪 2024-12-16 10:38:56

查看 XmlSerializerNamespaces

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("xsd", "http://www.w3.org/2001/XMLSchema");
ns.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");

控制默认命名空间可以直接在 XmlSerializer 上完成:

XmlSerializer xs = new XmlSerializer(typeof(Person), "http://tempuri.org/PaymentInformationXml.xsd");

...但是您的问题有点不清楚问题来自何处。

检查您的 Person[XmlType] 属性:

[XmlType(Namespace="http://tempuri.org/PaymentInformationXml.xsd")]
public class Person
{
    //...
}

您的 Person 类型的命名空间需要与序列化时使用的命名空间一致。

Check out XmlSerializerNamespaces.

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("xsd", "http://www.w3.org/2001/XMLSchema");
ns.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");

Controlling the default namespace can be done directly on the XmlSerializer:

XmlSerializer xs = new XmlSerializer(typeof(Person), "http://tempuri.org/PaymentInformationXml.xsd");

... but your question is a little unclear about where the problem comes from.

Check your Person classes [XmlType] attribute:

[XmlType(Namespace="http://tempuri.org/PaymentInformationXml.xsd")]
public class Person
{
    //...
}

The namespace for your Person type needs to be consistent with the one you use when serializing.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文