我可以修改我的POCO類,以便序列化時,它們包含所需的ENTITY
S'在閱讀this from W3C和this 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();
}
背景
我使用的是XmlSerializer
和StringWriter
連載我的根類爲一個字符串,然後驗證使用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; }
}
值的範圍我的目的僅限於NZ
和AU
。我可以添加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.
}
謝謝 - 我只是發現了你寫的。不知道是否本身作爲問題的答案。 – OutstandingBill
您錯過了NZ的命名空間。應該有xmlns:NZ在xml中的某個地方。 – jdweng
驗證器似乎很快樂,沒有實體上的名稱空間,以及[此MSDN頁面上的示例](https://msdn.microsoft.com/en-us/library/system.xml.xmlwriter.writedoctype(v = vs。 110).aspx)沒有一個。你能否展示你的推理爲什麼可能需要命名空間? – OutstandingBill