2011-07-11 53 views
2

我試圖將xml數據反序列化到與c#的對象。我一直使用.NET反序列化方法來完成這個工作,而且這對於我所需要的大部分工作都很有效。反序列化屬性名稱中的編碼字符的XMLDocument

現在雖然,我有一個由SharePoint創建的XML,我需要反序列化已編碼caracters,即數據的屬性名稱:

*空間,º,C A,:,*和連字符作爲 x0020x00bax007ax00e3x003ax002d respectivly

我試圖找出我必須把與attributeName參數屬性XmlAttribute

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..." 

與前兩個我沒有得到任何返回值,第三個讓我對無效運行時錯誤字符(冒號)。

無論如何得到這與.NET Deserialize工作,還是我必須建立一個特定的解串器?

謝謝!

回答

0

呃...我想我有點瞎了,現在工作。只需將_x *** _文字轉換器替換爲空白,並根據需要更正XmlAttribute。這種替換是通過首先將xml作爲字符串加載,然後替換,然後將「乾淨」文本加載爲XML來完成的。

但我wopuld仍想知道是否有可能使用一些XmlAttribute名稱爲一個更直接的方法......

2

什麼你正在尋找(下稱「神祕」的數據)被稱爲XML實體。它被SharePoint用來保護屬性名稱和類似的元素。

有幾種方法可以解決這個問題,最優雅的方法是解壓縮List模式並將元素與模式匹配。該模式包含有關您的列表數據的所有元數據。一個模式的拋光例子可以看出以下或在這裏http://www.bendsoft.com/documentation/camelot-php-tools/1_5/packets/schema-and-content-packets/schemas/example-list-view-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> 
+0

我的模式附加到我將要使用的數據。我從來沒有使用過XmlConvert類。我想知道它是否能解決我的問題。謝謝! – MytyMyky

+0

好吧,任何成功? –

+0

哇,我只是注意到我有這個答案,沒有關於它的通知。對不起Eric。你的解釋看起來很連貫。鏈接雖然,不再有效... – MytyMyky

0

嘗試使用System.Xml;XmlConvert.EncodeNameXmlConvert.DecodeName

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_") 
相關問題