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

3

我有一个很棒的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中没有'Product'子级,因为这三行都是一个产品。这是我的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"}]

正如您所知,JSON输出代表着XML输入。要更改它,您需要"打破"它。 - flindeberg
1
你尝试过调用 JsonConvert.SerializeXNode(x, Formatting.None, true) 吗?那个应该可以省略根节点。 - Jehof
哈哈,翻转布尔值正是我所需要的!谢谢@Jehof - JP Hellemons
3个回答

6

使用方法调用

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

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

0

不要使用xml写入器或转换,只需从原始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

我想要一个 JSON 文件,但我不明白你打算如何将 XML 转换成 JSON,能否再详细解释一下? - JP Hellemons
通过LinQ解析XML文件并将其存储在集合中,或者您可以直接以JSON文件格式编写。最好的方法是通过隔离文件流创建一个文件并将文件命名为filename.jason,然后您可以使用文件写入来写入文件。但不要忘记将其自定义为JSON格式... - AVIK DUTTA
基本上你会在文件流写入器中得到以下内容:{"Products":[{"@ProductCode":"//集合项变量1.data1","@CategoryName":"//集合项变量1.data2"}, {"@ProductCode":"//集合项变量2.data1","@CategoryName":"//集合项变量11.data1"},
{"@ProductCode":"//集合项变量13.data1","@CategoryName":"//集合项变量13.data3"}]}。
- AVIK DUTTA

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();
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接