.NET是否有类似于Json.NET的XML类型功能的等效功能?

3

我目前正在使用Newtonsoft Json.NET库来解析Json编码数据,然后将节点转换为所需的数据类型。

这是一个已经对我有用的示例数据结构:

{
    "ToolUtility": {
        "SharedBrushListModel": {
            "SelectedBrushInstanceID": 786
        },
        "SomethingElse": 42
    }
}

以下是我如何与这些数据进行交互的方法:

// Parse data and collate into groups of properties.
var store = new Dictionary<string, Dictionary<string, JProperty>>();
foreach (var group in JObject.Parse(jsonInput)) {
    var storeGroup = new Dictionary<string, JProperty>();
    store[group.Key] = storeGroup;

    foreach (var property in group.Value.Children<JProperty>())
        storeGroup[property.Name] = property;
}

// Convert nodes into the desired types.
var utilityNode = store["ToolUtility"];
var model = utilityNode["SharedBrushListModel"].ToObject<SharedBrushListModel>();
int somethingElse = utilityNode["SomethingElse"].ToObject<int>();

// Convert desired types back to nodes.
var nodeA = JToken.FromObject(model);
var nodeB = JToken.FromObject(somethingElse);

// Encode back to Json.
var outputRoot = new JObject();
outputRoot["ToolUtility"] = new JObject();
outputRoot["ToolUtility"]["SharedBrushListModel"] = nodeA;
outputRoot["ToolUtility"]["SomethingElse"] = nodeB;
string json = outputRoot.ToString(formatter);

这个API的好处是我可以解析Json编码数据,而无需包含任何类型注释,然后在稍后解决此问题时将节点显式转换为专用类型。
有没有一种使用常规.NET与XML做类似事情的方法?
<?xml version="1.0" encoding="utf-8"?>
<root>
    <ToolUtility>
        <SharedBrushListModel>
            <SelectedBrushInstanceID>786</SelectedBrushInstanceID>
        </SharedBrushListModel>
        <SomethingElse>42</SomethingElse>
    </ToolUtility>
</root>

我想使用标准的.NET库来实现这个,而不需要任何第三方库,比如Json.NET。
包含其他库的问题在于,目标环境(Unity游戏引擎)中会发生许多问题,其中多个资产包括相同的库。

你想将JSON解析为XML吗? - ManyRootsofAllEvil
3
了解一下“Linq to XML”(这里有一个例子https://dev59.com/uHRB5IYBdhLWcg3wSVcI,互联网上还有许多其他例子...)。 - user2819245
@ManyRootsofAllEvil 不,我想完全避免使用JSON步骤。 - Lea Hayes
3个回答

4
请查看System.Xml.Linq命名空间。以下是概念的映射:
  • JToken => XNode
  • JToken.Parse(string json) => XDocument.Parse(string xml)
  • JToken.ToObject<T>() => XNode.ToObject<T>() (下面显示的扩展方法)
默认情况下,ToObject<T>方法实际上并不存在于XNode中。以下是该扩展方法:
public T ToObject<T>(this XNode node)
{
    var serializer = new XmlSerializer(typeof(T));
    using (var reader = node.CreateReader())
    {
        return (T)serializer.Deserialize(reader);
    }
}

从MSDN上看,这似乎正是我要找的。现在我只希望Unity使用的Mono框架版本实际上支持这个。 - Lea Hayes
如果您的Mono项目的目标版本为3.5或更高,则会得到支持。 - Yuval Itzchakov

3

C#内置了一个称为LINQ To XML的功能。以下是查询语法的一个强大示例:

IEnumerable<XElement> partNos =
  from item in purchaseOrder.Descendants("Item")
  where (int) item.Element("Quantity") *
    (decimal) item.Element("USPrice") > 100
  orderby (string)item.Element("PartNumber")
  select item;

您可以使用声明性语法创建XML,例如:

XElement contacts =
  new XElement("Contacts",
      new XElement("Contact",
          new XElement("Name", "Patrick Hines"),
          new XElement("Phone", "206-555-0144", 
              new XAttribute("Type", "Home")),
          new XElement("phone", "425-555-0145",
              new XAttribute("Type", "Work")),
          new XElement("Address",
              new XElement("Street1", "123 Main St"),
              new XElement("City", "Mercer Island"),
              new XElement("State", "WA"),
              new XElement("Postal", "68042")
          )
      )
  );

有没有类似的从对象到Json的操作? - CesarD
1
@CesarD Json.NET 有 LINQ to JSON。 - Yuval Itzchakov

1
如果您使用类并在其中定义数据,则可以将数据(该类的对象)序列化和反序列化为XML:
var serializer = new XmlSerializer(SomeList.GetType());
using (var writer = XmlWriter.Create(SomeFile))
    serializer.Serialize(writer, SomeList);

并且

var serializer = new XmlSerializer(typeof(List<SomeClass>));
using (XmlReader reader = XmlReader.Create(SomeFile))
    SomeList = (List<SomeClass>)serializer.Deserialize(reader);

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