使用LinqPad查询XML的“blob”

时间:2018-01-11 15:15:15

标签: linq-to-xml linqpad

我有一些XML需要弄清楚如何使用LINQ to XML进行查询。我正在考虑使用LinqPad来帮助我找出查询我想要访问的特定节点和属性所需的语法。

LinqPad是否能够查询我可以从剪贴板粘贴的一小块XML(只要格式良好)?我只看到连接数据库的能力。

如果可以输入要由LinqPad解析的XML blob?

编辑:我有LinqPad - 付费版 - v5

2 个答案:

答案 0 :(得分:1)

LINQPad的连接是针对数据上下文的。您可能会找到或编写XML驱动程序,但它可能甚至不值得一看。只需在脚本中使用源代码作为文件或剪贴板从.NET代码访问XML。

LINQ to XML主要指XDocument等。 XDocument.Load或.Parse将帮助您入门。

以下是使用LINQ to XML查询剪贴板上的XML架构的两种方法:

XNamespace xsd = "http://www.w3.org/2001/XMLSchema";

// pure drilldown, step by step
XDocument.Parse(System.Windows.Clipboard.GetText())
    .Element(xsd + "schema")
    .Elements(xsd + "element")
    .Elements(xsd + "annotation")
    .Elements(xsd + "documentation")
    .Select(d => new { element = d.Parent.Parent.Attribute("name")?.Value, type = d.Parent.Parent.Attribute("type")?.Value, documentation = d?.Value})
    .Dump();

// alternative syntax, which has range variables that can be referenced in the select

(from schema in XDocument.Parse(System.Windows.Clipboard.GetText()).Elements(xsd + "schema")
from element in schema.Elements(xsd + "element")
from annotation in element.Elements(xsd + "annotation")
from documentation in annotation.Elements(xsd + "documentation")
select new {element = element.Attribute("name")?.Value, type = element.Attribute("type")?.Value, documentation?.Value})
    .Dump();

如果您熟悉XPathSelectElements等,也可以使用XPath。

注意:这些查询并不完全相同。第一个为路径中的每个文档元素都有一个项目。第二个为每个模式,每个元素,每个注释和每个文档至少有一个项目,而不管文档是否作为后代。

答案 1 :(得分:1)

如果您对使用VB感到满意,只需将xml内容粘贴到VB表达式/程序中即可。 VB支持XML文字,并将它们视为XDocument / XElement(取决于xml声明的存在)。然后,您可以使用VB的查询语法编写查询。

否则,如果你更喜欢C#,这里是我通常使用原始XML的模板。

// C# Program
void Main()
{
    var doc = XDocument.Parse(XmlStr);
    // do stuff with doc
    doc.Dump(); // if you want to reformat your xml
}

string XmlStr { get; } = /* paste your xml here as an escaped string (Alt + Shift + V) */;