gpt4 book ai didi

c# - 使用动态类型的 Fluent XML 翻译

转载 作者:太空宇宙 更新时间:2023-11-03 20:18:20 24 4
gpt4 key购买 nike

基于 Kevin Hazzard 在此处的发帖; http://blogs.captechconsulting.com/blog/kevin-hazzard/fluent-xml-parsing-using-cs-dynamic-type-part-1我正在尝试使用逻辑。基本上这应该做的是获取一段 XML 并将其转换为您可以使用的对象。例如。说我的 xml 是;

<someObject>
<Name>Timmy</Name>
</someObject>

我希望能够做到;

dynamic obj = Converter(xmlText);
string name obj.Name;

经过多次谷歌搜索后,我发现了 Kevin 的博客并发布了一个 DynamicXml 对象,它应该可以完成这项工作,但我无法让它工作(或者我没有正确使用它)。我对 .NET 的 Expando 对象的理解是有限的,除了博客文章外,我没有代码示例可以继续。我已将 Kevin 关于该主题的两篇文章整理成一个对象;

public class DynamicXml : DynamicObject, IEnumerable
{
private readonly List<XElement> _elements;

public DynamicXml(string text)
{
var doc = XDocument.Parse(text);
_elements = new List<XElement> { doc.Root };
}

protected DynamicXml(XElement element)
{
_elements = new List<XElement> { element };
}

protected DynamicXml(IEnumerable<XElement> elements)
{
_elements = new List<XElement>(elements);
}

public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = null;

// handle the Value and Count special cases
if (binder.Name == "Value")
{
result = _elements[0].Value;
}
else if (binder.Name == "Count")
{
result = _elements.Count;
}
else
{
// try to find a named attribute first
var attr = _elements[0].Attribute(XName.Get(binder.Name));
if (attr != null)
{
// if a named attribute was found, return that NON-dynamic object
result = attr;
}
else
{
// find the named descendants
var items = _elements.Descendants(
XName.Get(binder.Name));
if (items != null && items.Count() > 0)
{
// prepare a new dynamic object with the list of found descendants
result = new DynamicXml(items);
}
}
}

if (result == null)
{
// not found, create a new element here
_elements[0].AddFirst(new XElement(binder.Name));
result = new DynamicXml(_elements[0].Descendants().First());
}
return true;
}

public override bool TrySetMember(SetMemberBinder binder, object value)
{
if (binder.Name == "Value")
{
/* the Value property is the only one that may be modified. TryGetMember actually
creates new XML elements in this implementation */
_elements[0].Value = value.ToString();
return true;
}
return false;
}

public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
{
int ndx = (int)indexes[0];
result = new DynamicXml(_elements[ndx]);
return true;
}

public IEnumerator GetEnumerator()
{
foreach (var element in _elements)
yield return new DynamicXml(element);
}
}

我的用法是;

dynamic payload = new DynamicXml(PayloadData);
Name = payload.Name; // error thrown here

异常(exception)情况是;

Cannot implicitly convert type 'MyProject.Common.Exchange.DynamicXml' to 'string'

当我检查该对象时,它似乎是一系列嵌套的 DynamicXml - 从代码的内部来看,这似乎是正确的。所以我想知道我实际上是如何获得值 Name 的?根据博客,它应该只是 payload.Name。想法?

最佳答案

您错过了一件非常重要的事情:您可以按名称调用节点,但您必须取消引用它的值,因为 getMember 总是返回一个 DynamicXml 对象。

尝试:

payload.Name.Value

关于c# - 使用动态类型的 Fluent XML 翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15257327/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com