2012-06-26 91 views
0

我通常會搜索網頁的最高和最低的答案,但這次我畫了一個空白。我使用VS2005將代碼寫入POST xml到API。我有C#中的類設置,我序列化成一個XML文檔。這些類如下所示:在C#中序列化XML#

[Serializable] 
    [XmlRoot(Namespace = "", IsNullable = false)] 
    public class Request 
    { 
     public RequestIdentify Identify; 

     public string Method; 

     public string Params; 

    } 

    [Serializable] 
    public class RequestIdentify 
    { 
     public string StoreId; 

     public string Password; 
    } 

當我序列化此我得到:

<?xml version="1.0" encoding="UTF-8"?> 
<Request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Identify> 
     <StoreId>00</StoreId> 
     <Password>removed for security</Password> 
    </Identify> 
    <Method>ProductExport</Method> 
    <Params /> 
</Request> 

但API返回一個 「沒有XML派」 的錯誤。

如果我直接發送XML字符串中的爲:

string xml = @"<Request><Identify><StoreId>00</StoreId><Password>Removed for security</Password></Identify><Method>ProductExport</Method><Params /></Request>"; 

有效地發送該XML(而不在「請求」標籤模式的信息):

<Request> 
    <Identify> 
     <StoreId>00</StoreId> 
     <Password>Removed for security</Password> 
    </Identify> 
    <Method>ProductExport</Method> 
    <Params /> 
</Request> 

這似乎認識XML沒有問題。

所以我想我的問題是如何將我的當前類更改爲序列化到XML並獲得XML在第二種情況下?我假設我需要另一個「父」類來包裝現有的和對這個「父母」或類似的東西使用InnerXml屬性,但我不知道如何做到這一點。

對這個問題抱歉,我只用了3個月的C#,而且我是一名實習教師,不得不在工作中自學!

哦和PS我不知道爲什麼,但VS2005真的不想讓我用私有變量設置這些類,然後使用公共等價物的getter和setter,所以我讓他們寫出它們現在的樣子。

在此先感謝:-)

UPDATE:

與大多數事情一樣也很難,如果你不知道你需要問什麼或如何詞它來尋找答案,而是:

一旦我知道要尋找什麼,我發現我所需要的答案:

刪除XML聲明:

XmlWriterSettings writerSettings = new XmlWriterSettings(); 
writerSettings.OmitXmlDeclaration = true; 
StringWriter stringWriter = new StringWriter(); 
using (XmlWriter xmlWriter = XmlWriter.Create(stringWriter, writerSettings)) 
{ 
    serializer.Serialize(xmlWriter, request); 
} 
string xmlText = stringWriter.ToString(); 

拆卸/設置命名空間(由於上述答覆,幫助找到這一個!):

XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
ns.Add("", ""); 

感謝您的幫助大家誰回答或向我指出了正確的方向!是的,一旦我知道我在問什麼,我確實找到要閱讀的文章:-)這是我第一次在3個月的時間裏自我教導,因此我認爲自己做得很好...

+1

的可能的複製[XmlSerializer的:除去不必要的xsi和xsd命名空間(http://stackoverflow.com/questions/760262/xmlserializer-remove-unnecessary-xsi-and-xsd-namespaces) – J0HN

+0

不是解決方案,但您可以嘗試通過用空字符串替換命名空間屬性來操縱字符串xml。 –

+1

請顯示如何序列化您的課程。我猜你需要'XmlSerializerNamespaces _namespaces = new XmlSerializerNamespaces(new [] {XmlQualifiedName.Empty}); serializer.Serialize(writer,data,_namespaces);' – Reniuz

回答

0

從Rydal's博客:

默認情況下,XmlDocument對象將命名空間分配給XML字符串,並且還包括聲明作爲XML文檔的第一行。我絕對不需要或使用這些,因此,我需要刪除它們。以下是你如何去做這件事。

Removing declaration and namespaces from XML serialization

+0

我補充說:'XmlSerializerNamespaces ns = new XmlSerializerNamespaces();ns.Add(string.Empty,string.Empty);'現在它移除了不需要的名稱空間,但是<?xml version = \「1.0 \」encoding = \「utf-16 \」?>'似乎是仍然造成問題。我會仔細研究如何去除這個問題。 – Hadley

+0

您是否將'XmlWriterSettings'的OmitXmlDeclaration設置爲true? –

+0

不能只遵循文章? '刪除XML聲明'部分就是那個 – Reniuz