使用C#将XDocument或XmlDocument转换为JSON

时间:2014-10-28 10:03:41

标签: c# xml json linq-to-xml json.net

我有这个XML很棒:

<Products>
  <Product ProductCode="C1010" CategoryName="Coins" />
  <Product ProductCode="C1012" CategoryName="Coins" />
  <Product ProductCode="C1013" CategoryName="Coins" />
</Products>

但它输出到这个JSON:

{"Products":{"Product":[{"@ProductCode":"C1010","@CategoryName":"Coins"},
                        {"@ProductCode":"C1012","@CategoryName":"Coins"},     
                        {"@ProductCode":"C1013","@CategoryName":"Coins"}]}}

我想在我的json中没有“产品”分级,因为所有三行都是产品。这是我的C#代码:

//x is an XDocument. 
JsonConvert.SerializeXNode(x, Formatting.None, false)
//JsonConvert.SerializeXNode(x); //I also tried without the formatting and the boolean. 

当我将一个XDocument转换为XmlDocument并使用:

var xmlDocument = new System.Xml.XmlDocument();
using (var xmlReader = x.CreateReader())
{
    xmlDocument.Load(xmlReader);
}
JsonConvert.SerializeXmNode(xmlDocument);

它给了我完全相同的输出。那么如何修改我的JSON解析,以便我有一个简单的产品列表。我更喜欢最干净的解决方案。

或许更清楚一点,我会像输出一样:

[{"@ProductCode":"C1010","@CategoryName":"Coins"},
{"@ProductCode":"C1012","@CategoryName":"Coins"},     
{"@ProductCode":"C1013","@CategoryName":"Coins"}]

3 个答案:

答案 0 :(得分:5)

使用方法调用

JsonConvert.SerializeXNode(x, Formatting.None, true);

这将省略根节点,并应创建您期望的内容。

答案 1 :(得分:0)

而不是使用xml writer或con version只需从原始xml文件中读取新文件中的写入文件流编写器。

基本上你会:

List xml_retrevedData = new List();
FileStramWriter fr = new FileStramWriter(); 
fr.Write("{"Products":[{"@ProductCode":" //colection item 
variable1.data1","@CategoryName":"//colection item 
variable1.data2"}, {"@ProductCode":"//colection item 
variable2.data1","@CategoryName":"//colection item 
variable11.data1"},
{"@ProductCode":"//colection item variable13.data1","@CategoryName":"//colection item variable13.data3"}]}"); 
// in side the file stream Writer

答案 2 :(得分:0)

试试这个

public string getData(ref XmlDocument doc) {

        JObject productobj = new JObject();

        var productsenum = from p in doc.GetElementsByTagName("product").Cast<XmlElement>()
                           select p;

        JArray products = new JArray();
        foreach (XmlElement p in productsenum) {
            JObject pobj = new JObject();
            pobj["ProductCode"] = p.GetAttribute("ProductCode");
            pobj["CategoryName"]= p.GetAttribute("CategoryName");

            products.Add(pobj);
        }

        JObject product = new JObject();
        product["Product"] = products;

        productobj["Products"] = product;

        return productobj.ToString();
    }
相关问题