15

値をシリアル化すると: データの値が存在しない場合、以下の形式のようになります。

  <Note>
        <Type>Acknowledged by PPS</Type>
        <Data />
  </Note>

しかし、以下の形式のxmlデータが必要です:

  <Note>
        <Type>Acknowledged by PPS</Type>
        <Data></Data>
  </Note>

コードこのために私は書いた:

[Serializable]
public class Notes
{
    [XmlElement("Type")]
    public string typeName { get; set; }

    [XmlElement("Data")]
    public string dataValue { get; set; }
}

データに値が割り当てられていない場合、以下の形式でデータを取得するために何をすべきかわかりません。

  <Note>
        <Type>Acknowledged by PPS</Type>
        <Data></Data>
  </Note>
4

5 に答える 5

14

これを行うには、シリアル化プロセスに渡す独自の XmlTextWriter を作成します。

public class MyXmlTextWriter : XmlTextWriter
{
    public MyXmlTextWriter(Stream stream) : base(stream, Encoding.UTF8)
    {

    }

    public override void WriteEndElement()
    {
        base.WriteFullEndElement();
    }
}

次を使用して結果をテストできます。

class Program
{
    static void Main(string[] args)
    {
        using (var stream = new MemoryStream())
        {
            var serializer = new XmlSerializer(typeof(Notes));
            var writer = new MyXmlTextWriter(stream);
            serializer.Serialize(writer, new Notes() { typeName = "Acknowledged by PPS", dataValue="" });
            var result = Encoding.UTF8.GetString(stream.ToArray());
            Console.WriteLine(result);
        }
       Console.ReadKey();
    }
于 2012-11-24T10:47:36.527 に答える
1

クラッジ時間 - HTML で有効な System.Xml.XmlDocument.OuterXml() 出力の生成を参照してください

基本的に、XML ドキュメントが生成された後、各ノードを通過し、子がない場合は空のテキスト ノードを追加します。

// Call with
addSpaceToEmptyNodes(xmlDoc.FirstChild);

private void addSpaceToEmptyNodes(XmlNode node)
{
    if (node.HasChildNodes)
    {
        foreach (XmlNode child in node.ChildNodes)
            addSpaceToEmptyNodes(child);
    }
    else         
        node.AppendChild(node.OwnerDocument.CreateTextNode(""))
}

(はい、これを行う必要がないことはわかっています-しかし、XMLを簡単に修正できない他のシステムに送信する場合は、物事について実用的にする必要があります)

于 2012-12-11T21:38:01.250 に答える
1

IMO を使用して目的の XML を生成することはできませんSerializationLINQ to XMLただし、次のように目的のスキーマを生成するために使用できます-

XDocument xDocument = new XDocument();
XElement rootNode = new XElement(typeof(Notes).Name);
foreach (var property in typeof(Notes).GetProperties())
{
   if (property.GetValue(a, null) == null)
   {
       property.SetValue(a, string.Empty, null);
   }
   XElement childNode = new XElement(property.Name, property.GetValue(a, null));
   rootNode.Add(childNode);
}
xDocument.Add(rootNode);
XmlWriterSettings xws = new XmlWriterSettings() { Indent=true };
using (XmlWriter writer = XmlWriter.Create("D:\\Sample.xml", xws))
{
    xDocument.Save(writer);
}

主な獲物はin case your value is null, you should set it to empty string. しますforce the closing tag to be generated。値が null の場合、終了タグは作成されません。

于 2012-11-24T10:19:34.987 に答える
0

自己閉鎖要素を防ぐために、ダミー フィールドを追加できます。

[XmlText]
public string datavalue= " ";

または、クラスのコードが必要な場合は、クラスは次のようになります。

public class Notes
{
   [XmlElement("Type")]
   public string typeName { get; set; }

   [XmlElement("Data")]
   private string _dataValue;
   public string dataValue {
      get {
          if(string.IsNullOrEmpty(_dataValue))
             return " ";
          else
             return _dataValue;
      }
      set {
          _dataValue = value;
      }
   }
}
于 2016-12-05T11:41:10.600 に答える