我正在尝试使用c#将xml数据反序列化为对象。我总是使用.NET反序列化方法完成此操作,这对我所需要的大部分内容都有效。
现在,我有一个由Sharepoint创建的XML,我需要反序列化的数据的属性名称有编码的caracters,即:
* space,º,çã,:,*和连字符为 x0020 , x00ba , x007a , x00e3 , x003a 和 x002d < / em>分别
我正在试图找出我必须在属性XmlAttribute中的attributeName参数中放入什么
x0020 转换为空间,例如,我可以使用
[XmlAttribute(AttributeName = "ows_Nome Completo")]
阅读
ows_Nome_x0020_Completo="MARIA..."
另一方面,
[XmlAttribute(AttributeName = "ows_Motiva_x00e7__x00e3_o_x003a_")]
,也不
[XmlAttribute(AttributeName = "ows_Motivação_x003a_")]
,也不
[XmlAttribute(AttributeName = "ows_Motivação:")]
请允许我阅读
ows_Motiva_x00e7__x00e3_o_x003a_="text to read..."
前两个没有返回值,第三个给了我一个无效caracters(冒号)的运行时错误。
无论如何要使用.NET反序列化,或者我是否必须为此构建特定的反序列化器?
谢谢!
答案 0 :(得分:2)
您正在查看的内容(“神秘”数据)称为XML实体。 SharePoint使用它来保护属性名称和类似元素。
有几种方法可以解决这个问题,最优雅的解决方法是提取List模式并将元素与模式匹配。架构包含有关列表数据的所有元数据。在下面或http://www.bendsoft.com/documentation/camelot-php-tools/1_5/packets/schema-and-content-packets/schemas/example-list-view-schema/
中可以看到一个精简的Schema示例如果您不想走这条路,可以从http://msdn.microsoft.com/en-us/library/35577sxd.aspx
开始<Field Name="ContentType">
<ID>c042a256-787d-4a6f-8a8a-cf6ab767f12d</ID>
<DisplayName>Content Type</DisplayName>
<Type>Text</Type>
<Required>False</Required>
<ReadOnly>True</ReadOnly>
<PrimaryKey>False</PrimaryKey>
<Percentage>False</Percentage>
<RichText>False</RichText>
<VisibleInView>True</VisibleInView>
<AppendOnly>False</AppendOnly>
<FillInChoice>False</FillInChoice>
<HTMLEncode>False</HTMLEncode>
<Mult>False</Mult>
<Filterable>True</Filterable>
<Sortable>True</Sortable>
<Group>_Hidden</Group>
</Field>
<Field Name="Title">
<ID>fa564e0f-0c70-4ab9-b863-0177e6ddd247</ID>
<DisplayName>Title</DisplayName>
<Type>Text</Type>
<Required>True</Required>
<ReadOnly>False</ReadOnly>
<PrimaryKey>False</PrimaryKey>
<Percentage>False</Percentage>
<RichText>False</RichText>
<VisibleInView>True</VisibleInView>
<AppendOnly>False</AppendOnly>
<FillInChoice>False</FillInChoice>
<HTMLEncode>False</HTMLEncode>
<Mult>False</Mult>
<Filterable>True</Filterable>
<Sortable>True</Sortable>
</Field>
<Field>
...
</Field>
答案 1 :(得分:0)
嗯......我想我有点乱砍,现在有效。刚刚替换了_x *** _ charecters,并纠正了XmlAttributes。这种替换是通过首先将xml作为字符串加载,然后替换,然后将“干净”文本作为XML加载来完成的。
但是我仍然想知道是否可以使用一些XmlAttribute Name来实现更直接的方法......
答案 2 :(得分:0)
尝试使用System.Xml;
XmlConvert.EncodeName
和XmlConvert.DecodeName
答案 3 :(得分:0)
我使用一个简单的函数来获取NameCol:
private string getNameCol(string colName) {
if (colName.Length > 20) colName = colName.Substring(0, 20);
return System.Xml.XmlConvert.EncodeName(colName);
}
我已经在搜索á,é,í,ó,ú等替换字符。 EncodeName不会转换此字符。 可以使用替换:
.Replace("ó","_x00f3_").Replace("á","_x00e1_")