【问题标题】:Is it possible to load DGML file with the function of XDocument like loading XML file?是否可以像加载 XML 文件一样使用 XDocument 的功能加载 DGML 文件?
【发布时间】:2019-05-15 14:12:32
【问题描述】:

我想将 DGML 文件加载到 C# 代码中,就像加载 XML 文件一样。我应该如何写来加载它们?

我找不到关于 DGML 文件加载器的好示例,但是,我找到了 XML 文件加载器示例。所以我尝试加载 DGML 文件,例如使用 XDocument 函数加载 XML 文件。

这是我创建的一个函数,它适用于 XML 文件。但 DGML 文件无法正常加载。

string DGMLFileName = "test.dgml"

if (!DGMLFileName.Contains(".dgml"))
    DGMLFileName += ".dgml";

string text = ReadString(DGMLFileName);

if (text == "")
{
    DebugLog("DGML not found or empty");
    return null;
}

if (text.StartsWith("<?xml"))
{
    text = text.Substring(text.IndexOf("?>") + 2);
}

DebugLog("DGML text ... " + text);

XDocument doc = XDocument.Parse(text);
var root = doc.Elements("DirectedGraph");
var elements = root.Elements("Nodes").Elements("Node");

foreach (var item in elements)
{
    var name = item.Attribute("Id").Value;
}


在这段代码中,元素是空的。我试图加载的是这种简单的 DGML 文件。 "https://docs.microsoft.com/en-us/visualstudio/modeling/directed-graph-markup-language-dgml-reference?view=vs-2019"

<?xml version="1.0" encoding="utf-8"?>
<DirectedGraph Title="DrivingTest" xmlns="http://schemas.microsoft.com/vs/2009/dgml">
   <Nodes>
      <Node Id="Driver" Label="Driver" Category="Person" DrivingAge="18"/>
      <Node Id="Car" Label="Car" Category="Automobile" />
      <Node Id="Truck" Label="Truck" Category="Automobile" />
      <Node Id="Passenger" Category="Person" />
   </Nodes>
   <Links>
      <Link Source="Driver" Target="Car" Label="Passed" Category="PassedTest" />
      <Link Source="Driver" Target="Truck" Label="Failed" Category="FailedTest" />
   </Links>
   <Categories>
      <Category Id="Person" Background="Orange" />
      <Category Id="Automobile" Background="Yellow"/>
      <Category Id="PassedTest" Label="Passed" Stroke="Black" Background="Green" />
      <Category Id="FailedTest" Label="Failed" BasedOn="PassedTest" Background="Red" />
   </Categories>
   <Properties>
       <Property Id="DrivingAge" Label="Driving Age" DataType="System.Int32" />
   </Properties>
</DirectedGraph>

我的代码中有哪些不正确的部分?

谢谢,

【问题讨论】:

  • 你遇到什么样的错误?
  • 我没有收到任何错误,但var elements 为空。如果代码正确,我认为Node的元素应该在那里。
  • 'var elements = root.Elements("Nodes");'如果只使用它,元素也是空的吗?
  • 请同时上传您的 DGML 文件,以便我们检查您问题的两面代码和 XML
  • var elements = root.Elements("Nodes"); 也是空的。非常感谢你。我会更新帖子,但实际上,我现在正在尝试从 Microsoft 获取样本。

标签: c# dgml


【解决方案1】:

事实上,不是 xml 解析器不喜欢命名空间,而是你没有请求正确的元素名称。

您“只需”在要查询的元素名称中包含命名空间:

XNamespace dgmlNs = "http://schemas.microsoft.com/vs/2009/dgml";
var doc = XDocument.Load("file.dgml");
var nodeElements = doc.Root.Elements( dgmlNs+"Nodes").Elements( dgmlNs+"Node");

这实际上会给你结果。

为了减少这方面的乏味(并提高可读性):

XName nodesName = dgmlNs + "Nodes";
XName nodeName = dgmlNs + "Node";
var nodes = doc.Root.Elements( nodesName ).Elements( nodeName );

【讨论】:

  • 确实更好!
  • 感谢您的建议。我也尝试了这种模式并且它有效。正如你提到的,这更具可读性。
【解决方案2】:

在我看来 XML 解析器不喜欢文件的 xmlns 尝试替换它:

<DirectedGraph Title="DrivingTest" xmlns="http://schemas.microsoft.com/vs/2009/dgml">

<DirectedGraph Title="DrivingTest" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

现在,您的 xml 解析器将能够读取代码中的文件,您需要使用 string.Replace() 来操纵变量 text,例如

我测试了以下 XML:

<?xml version="1.0" encoding="utf-8"?>
<DirectedGraph Title="DrivingTest" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <Nodes>
      <Node Id="Driver" Label="Driver" Category="Person" DrivingAge="18"/>
      <Node Id="Car" Label="Car" Category="Automobile" />
      <Node Id="Truck" Label="Truck" Category="Automobile" />
      <Node Id="Passenger" Category="Person" />
   </Nodes>
   <Links>
      <Link Source="Driver" Target="Car" Label="Passed" Category="PassedTest" />
      <Link Source="Driver" Target="Truck" Label="Failed" Category="FailedTest" />
   </Links>
   <Categories>
      <Category Id="Person" Background="Orange" />
      <Category Id="Automobile" Background="Yellow"/>
      <Category Id="PassedTest" Label="Passed" Stroke="Black" Background="Green" />
      <Category Id="FailedTest" Label="Failed" BasedOn="PassedTest" Background="Red" />
   </Categories>
   <Properties>
       <Property Id="DrivingAge" Label="Driving Age" DataType="System.Int32" />
   </Properties>
</DirectedGraph>

使用此代码:

    void ReadXML()
    {
        XDocument doc = XDocument.Load("tmp.xml");
        var root = doc.Elements("DirectedGraph");
        var elements = root.Elements("Nodes").Elements("Node");

        foreach (var item in elements)
        {
            var name = item.Attribute("Id").Value;
        }
    }

我可以想象您不想将文件作为标准格式进行操作,因此只需在代码中处理 text变量,然后再将其传递给解析器

【讨论】:

  • 谢谢,你是对的。 DGML 加载程序现在正在工作。
  • 您不再加载 DGML,而是加载 DGML 的残缺版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多