Можно ли загрузить файл DGML с функцией XDocument, такой как загрузка файла XML? - PullRequest
1 голос
/ 15 мая 2019

Я хотел бы загрузить файл DGML в код C #, как при загрузке файлов XML. Как мне написать, чтобы загрузить их?

Я не смог найти хороших примеров о загрузчике файлов DGML, однако нашел примеры загрузчиков файлов XML. Поэтому я попытался загрузить файлы DGML, такие как загрузка файлов XML, используя функцию XDocument.

Это функция, которую я сделал, и она работает с файлами 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>

Что является неправильной частью моего кода?

Спасибо

Ответы [ 2 ]

2 голосов
/ 17 мая 2019

На самом деле, дело не в том, что анализатор 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 );
1 голос
/ 15 мая 2019

мне кажется, синтаксическому анализатору 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 сможет читатьфайл в вашем коде, который вам нужен для управления вашей переменной text с string.Replace(), например

. Я проверил следующий 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 в свой код перед передачей в синтаксический анализатор

...