gpt4 book ai didi

XML 导航和读取使用 C# 4.0 动态?

转载 作者:数据小太阳 更新时间:2023-10-29 02:37:53 27 4
gpt4 key购买 nike

.NET 4.0 中是否提供支持 DLR 的 XML 导航和阅读类?例如,假设我有这个 XML:

<foo>
<bar>foobar is here</bar>
<bar>foobar is also here</bar>
<baz>foobar is not here</bar>
</foo>

有没有一种简单的方法可以像这样浏览这个 XML:

var doc = SomeDlrEnabledParser.Parse (xmlString);
foreach (var node in doc.foo.bar)
{
if (node == "foobar is here")
DoSomething();
else
DoSomethingElse();
}

我可以看到上述方法有问题的很多原因,包括 namespace 、属性与元素、区分集合与单个元素、编码的 XML 与文本等。

但我处理的大部分 XML 都非常简单且只读,我愿意接受合理的默认行为,以换取避免“括号和引号汤”,这是在4.0 之前的世界。

例如,“点”运算符可以在子元素名称之前检查属性名称。或者非集合操作将自动应用于第一个元素(就像 jQuery 那样)。

.NET 4.0 Framework 类库是否包含此类内容?如果没有,有什么好的开源项目或支持 DLR 的 XML 库示例的建议吗?

最佳答案

我做了一点测试实现:

public class DynamicXml : DynamicObject, IEnumerable<XNode>
{
private readonly IEnumerable<XNode> nodes;

public DynamicXml(params XNode[] nodes)
{
this.nodes = nodes;
}

public override bool TryGetMember(GetMemberBinder binder, out object result)
{
var children = nodes.OfType<XContainer>().SelectMany(node => node.Elements(binder.Name)).Cast<XNode>().ToArray();
result = new DynamicXml(children);
return true;
}

public IEnumerator<XNode> GetEnumerator()
{
return nodes.GetEnumerator();
}

IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}

例子:

class Program
{
static void Main(string[] args)
{
dynamic dynDoc = new DynamicXml(XDocument.Parse(
@"<foo>
<bar>foobar is here</bar>
<bar>foobar is also here</bar>
<baz>foobar is not here</baz>
</foo>"));

foreach (XElement node in dynDoc.foo.bar)
{
if (node.Value == "foobar is here")
Console.WriteLine("found: {0}", node);
else
Console.WriteLine("not found: {0}", node);
}

Console.ReadKey(true);
}
}

但是,似乎这段代码和其他一些代码之间的接口(interface)不太好。

例如,如果我们想对节点使用 Linq,我们必须首先显式转换为 IEnumerable...否则我们的 Where 将被解释为元素名称.

((DynamicXml)dynXml.foo.bar).Where(x => x.Value == "foobar is here");

您可以直接在动态类型上实现 Where,但您必须像这样限定所有 lambda:

foo.bar.Where((Func<XElement,bool>)(x => x.Value == "foobar is here")) 

也就是说,如果您只是像这样从 XML 树中提取值,我认为它工作正常。

关于XML 导航和读取使用 C# 4.0 动态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3349002/

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