2017-05-26 27 views
0

問題如何在序列化時添加ENTITY?

我可以修改我的POCO類,以便序列化時,它們包含所需的ENTITY S'在閱讀this from W3Cthis answer to a similar question後,我意識到我的XML應該包含DOCTYPE如下,我只是不知道如何插入它。

<?xml version="1.0" encoding="utf-16"?> 
<!DOCTYPE documentElement[<!ENTITY NZ "NZ"><!ENTITY AU "AU">]> 
<ValuationTransaction xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://vx.valex.com.au/lixi/schema/1.3.5/ValuationTransaction.xsd" ProductionData="Yes"> 
    ... etc. 
</ValuationTransaction> 

我的串行化的代碼如下所示

public static string ToXmlString(this ValuationTransaction payloadPoco) 
{ 
    var stringwriter = new StringWriter(); 
    var serializer = new XmlSerializer(payloadPoco.GetType()); 
    serializer.Serialize(stringwriter, payloadPoco); 
    return stringwriter.ToString(); 
} 

背景

我使用的是XmlSerializerStringWriter連載我的根類爲一個字符串,然後驗證使用XML字符串一個來自this post的XmlValidator。在驗證XML驗證器說...

引用未申報的實體,'NZ'。在管線37的位置24

...這是指該元素

<Country ISO3166="NZ">NEW ZEALAND</Country> 

ISO3166屬性...的定義是:

[System.Xml.Serialization.XmlAttributeAttribute(DataType = "ENTITY")] 
public string ISO3166 
{ 
    get { return this.iSO3166Field; } 
    set { this.iSO3166Field = value; } 
} 

值的範圍我的目的僅限於NZAU。我可以添加DOCTYPE這樣,雖然很明顯,我寧願找一個更好的辦法:

var entitiesDtd = @"<!DOCTYPE documentElement[<!ENTITY NZ ""NZ""><!ENTITY AU ""AU"">]>" + Environment.NewLine; 
xmlString = xmlString.Insert(xmlString.IndexOf("<ValuationTransaction"), entitiesDtd); 

的XML根類(由xsd.exe產生並手動調整,以增加noNamespaceSchemaLocation)的定義是

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] 
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)] 
public partial class ValuationTransaction 
{ 
    [XmlAttribute("noNamespaceSchemaLocation", Namespace = "http://www.w3.org/2001/XMLSchema-instance")] 
    public string noNamespaceSchemaLocation = "https://vx.valex.com.au/lixi/schema/1.3.5/ValuationTransaction.xsd"; 
    ... etc. 
} 

回答

0

我改變了我的序列號,使它包含XmlWriter根據this answer

XmlSerializer xsSubmit = new XmlSerializer(typeof(ValuationTransaction)); 
var subReq = payloadPoco; 
var xml = ""; 

using (var sww = new StringWriter()) 
{ 
    var writerSettings = new XmlWriterSettings(); 
    writerSettings.Indent = true; 

    using (XmlWriter writer = XmlWriter.Create(sww, writerSettings)) 
    { 
     writer.WriteDocType("documentElement", null, null, "<!ENTITY AU \"Australia\"><!ENTITY NZ \"New Zealand\">"); 
     xsSubmit.Serialize(writer, subReq); 
     xml = sww.ToString(); // Your XML 
     return xml; 
    } 
} 
0

您需要添加設置

  XmlWriterSettings settings = new XmlWriterSettings(); 
      settings.Indent = true; 
      XmlWriter writer = XmlWriter.Create(sww, settings); 
+0

謝謝 - 我只是發現了你寫的。不知道是否本身作爲問題的答案。 – OutstandingBill

+0

您錯過了NZ的命名空間。應該有xmlns:NZ在xml中的某個地方。 – jdweng

+0

驗證器似乎很快樂,沒有實體上的名稱空間,以及[此MSDN頁面上的示例](https://msdn.microsoft.com/en-us/library/system.xml.xmlwriter.writedoctype(v = vs。 110).aspx)沒有一個。你能否展示你的推理爲什麼可能需要命名空間? – OutstandingBill

相關問題