使用属性名称中的编码字符反序列化XMLDocument

时间:2011-07-11 14:50:48

标签: sharepoint c#-3.0 character xml-deserialization

我正在尝试使用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反序列化,或者我是否必须为此构建特定的反序列化器?

谢谢!

4 个答案:

答案 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.EncodeNameXmlConvert.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_")