2016-11-02 6 views
0

これは意図した通りですが、簡略化してSerializeXmlNodeから出力を減らそうとしています。JsonConvert.SerializeXmlNodeを使用してJSONの標準的なキーと値のペアの属性と値を定義します。

コード:ここで

XmlDocument XMLDoc = new XmlDocument(); 
XMLDoc.LoadXml(NewXML); 

string EventDataJSON = JsonConvert.SerializeXmlNode(XMLDoc, 0, true); 

は私のXMLです:

<DataEntries> 
    <Data Name="Direction">in</Data> 
    <Data Name="SourceAddress">222.0.0.252</Data> 
    <Data Name="SourcePort">5355</Data> 
    <Data Name="DestAddress">192.168.1.24</Data> 
</DataEntries> 

現在のJSON出力:

{"@Name":"Direction","#text":"in"}, 
{"@Name":"SourceAddress","#text":"222.0.0.252"}, 
{"@Name":"SourcePort","#text":"5355"}, 
{"@Name":"DestAddress","#text":"192.168.1.24"} 

理想のJSON出力(インデントは無関係です):

{ 
    "Direction":"in", 
    "SourceAddress":"222.0.0.252", 
    "SourcePort":"5355", 
    "DestAddress":"192.168.1.24" 
} 

正規表現を使用したくない場合は、私はこの時点で何かを開いています。私の他の選択肢はJavaScriptSerializerですが、JSON.netライブラリ内でこれを行う方法があれば、それが望ましいでしょう。

答えて

1

Converting between JSON and XMLの場合JSONから作成したXMLが目的のものと一致しない場合は、手動で変換する必要があります。あなたが事前にXmlDocumentにあなたのXMLをロードしているので、この場合は、そうのようなXMLを事前処理するための最も簡単なようだ:

XmlDocument XMLDoc = new XmlDocument(); 
XMLDoc.LoadXml(NewXML); 

foreach (XmlElement entry in XMLDoc.SelectNodes("//DataEntries")) 
{ 
    var data = entry.ChildNodes.OfType<XmlElement>().ToList(); 
    foreach (var d in data) 
    { 
     var e = XMLDoc.CreateElement(d.Attributes["Name"].Value); 
     e.InnerText = d.InnerText; 
     entry.AppendChild(e); 
    } 
    foreach (var d in data) 
    { 
     entry.RemoveChild(d); 
    } 
} 

string EventDataJSON = JsonConvert.SerializeXmlNode(XMLDoc, 0, true); 

あなたはより現代的なLINQ to XML APIへの切り替えを検討してください。その場合、コードは次のようになります。

var doc = XDocument.Parse(NewXML); 
foreach (var entry in doc.Descendants("DataEntries")) 
{ 
    var data = entry.Elements("Data").ToList(); 
    foreach (var d in data) 
    { 
     entry.Add(new XElement((string)d.Attribute("Name"), d.Value)); 
    } 
    data.Remove(); 
} 

string EventDataJSON = JsonConvert.SerializeXNode(doc, 0, true); 

サンプルfiddleのようになります。

関連する問題