我尝试读取包含以下元素的XML文件:
<ho:CODED-TYPE ho:BASE-DATA-TYPE="A_UINT16" CATEGORY="STANDARD-LENGTH-TYPE" ENCODING="UNSIGNED">
我的类描述这个节点看起来像这样:
public ref class FIBEXCodedType
{
public:
[XmlAttribute("ho:BASE-DATA-TYPE")]
property String^ BaseDataType;
[XmlAttribute("CATEGORY")]
property String^ Category;
[XmlAttribute("ENCODING")]
property String^ Encoding;
FIBEXCodedType(void);
};
我从XmlSerializer.ctor得到一个InvalidOperationException告诉我:
“在'ho:BASE-DATA-TYPE'中取代了Namenszeichen。” (这可以翻译为“无效字符:'ho:BASE-DATA-TYPE'”)。
我也尝试了以下内容:
[XmlAttribute("BASE-DATA-TYPE", Namespace="http://www.asam.net/xml")]
property String^ BaseDataType;
但这也不起作用。这次没有错误消息但是单元测试没有告诉我,该属性仍然设置为“null”。
我完全坚持这一点。所以任何帮助都表示赞赏
提前致谢
编辑:更多XML
<?xml version="1.0" ?>
<fx:FIBEX xmlns:fx="http://www.asam.net/xml/fbx" xmlns:ho="http://www.asam.net/xml" xmlns:can="http://www.asam.net/xml/fbx/can" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="fibex4can.xsd" VERSION="3.1.0">
<fx:CODING ID="codingSpeed">
<ho:SHORT-NAME>CodingSpeed</ho:SHORT-NAME>
<ho:DESC>Coding for speed values within this system.</ho:DESC>
<ho:CODED-TYPE ho:BASE-DATA-TYPE="A_UINT16" CATEGORY="STANDARD-LENGTH-TYPE" ENCODING="UNSIGNED">
<ho:BIT-LENGTH>16</ho:BIT-LENGTH>
</ho:CODED-TYPE>
</fx:CODING>
答案 0 :(得分:2)
在OP
编辑后重写了整个答案我对错误的原始理解是错误的。当您读取XML时,错误将在序列化程序的初始化时抛出, not 。您不能在名称中使用冒号:
。如果指定命名空间,请不要指定前缀。实际上,你几乎没有指定前缀(它只是命名空间的占位符)。
执行此操作后,您已注意到该值最终为null
。原因是序列化程序默认为不合格的属性。如果您具有限定属性,则它假定属性名称空间与元素的名称空间不同。这将有效:
<!-- this works (if namespaces are indeed different -->
<ho:CODED-TYPE fx:BASE=DATA-TYPE="A_UINT16"...>
<!-- this works, unqualified name takes namespace of parent element -->
<ho:CODED-TYPE BASE=DATA-TYPE="A_UINT16"...>
<!-- this fails, because XmlSerializer does not expect qualified attributes -->
<ho:CODED-TYPE ho:BASE=DATA-TYPE="A_UINT16"...>
这似乎是一个奇怪的错误。这是MSDN上的somewhat similar report on this n,它帮助我解决了问题。只需将属性标记为合格。以下内容适用于您的输入XML(注意XmlSchemaForm.Qualified
):
[XmlRoot(ElementName = "FIBEX", Namespace = "http://www.asam.net/xml/fbx")]
public class FIBEX
{
[XmlElement("CODING", Namespace = "http://www.asam.net/xml/fbx")]
public FIBEXCoding Coding { get; set; }
}
public class FIBEXCoding
{
[XmlElement("SHORT-NAME", Namespace = "http://www.asam.net/xml")]
public string ShortName { get; set; }
[XmlElement("DESC", Namespace = "http://www.asam.net/xml")]
public string ShortDescription { get; set; }
[XmlElement("CODED-TYPE", Namespace = "http://www.asam.net/xml")]
public FIBEXCodedType Codedtype { get; set; }
}
public class FIBEXCodedType
{
[XmlAttribute("BASE-DATA-TYPE",
Namespace = "http://www.asam.net/xml",
Form=XmlSchemaForm.Qualified)]
public string BaseDataType { get; set; }
[XmlAttribute("CATEGORY")]
public string Category { get; set; }
[XmlAttribute("ENCODING")]
public string Encoding { get; set; }
[XmlElement("BIT-LENGTH", Namespace = "http://www.asam.net/xml")]
public int BitLength { get; set; }
}