是否可以像加载 XML 文件一样使用 XDocument 的功能加载 DGML 文件?
Is it possible to load DGML file with the function of XDocument like loading XML file?
我想将 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>
我的代码有什么不正确的部分?
谢谢,
在我看来 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
变量,然后再将其传递给解析器
事实上,这不是 xml 解析器不喜欢命名空间,而是你没有请求正确的元素名称。
您'simply'需要在您查询的元素名称中包含命名空间:
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 );
我想将 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>
我的代码有什么不正确的部分?
谢谢,
在我看来 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
变量,然后再将其传递给解析器
事实上,这不是 xml 解析器不喜欢命名空间,而是你没有请求正确的元素名称。
您'simply'需要在您查询的元素名称中包含命名空间:
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 );