如何从 XDocument 代码更改为 XMLDocument 代码?
How to change from XDocument to XMLDocument Code?
嘿,我有两个 xml 文件和以下代码:
DataTable table = new DataTable();
List<string> headingNames = new List<string>();
List<string> valueNames = new List<string>();
//first xml file
XDocument config = XDocument.Load(configFile);
Dictionary<string, string> dict = config.Descendants("Columns").FirstOrDefault().Elements()
.GroupBy(x => (string)x.Attribute("XPath"), y => (string)y.Attribute("Name"))
.ToDictionary(x => x.Key, y => y.FirstOrDefault());
//second xml file
XDocument data = XDocument.Load(dataFile);
List<XElement> positions = data.Descendants("Position").ToList();
但是我得改成XML文档代码
这里是第一个XML:
<?xml version="1.0" encoding="utf-8"?>
<ROOT>
<Columns BaseXPath="//Orders/Position/">
<Colum XPath="@PositionSK" Name="Position"/>
<Colum XPath="@PosGroup" Name="Gruppen-Nr"/>
<Colum XPath="@PosNumber" Name="PositionsNr"/>
<Colum XPath="@PositionCommercialTypeSK" Name="Status"/>
<Colum XPath="@BundlePositionSK" Name="BundlePositionSK"/>
<Colum XPath="@MainPositionSK" Name="MainPositionSK"/>
<Colum XPath="@SalesAgentPrice" Name="Preis"/>
<Colum XPath="@Catchword" Name="Suchwort"/>
<Colum XPath="@ContentComponentCommSK" Name="IKO"/>
<Colum XPath="@PositionTypeSK" Name="PositionsTyp"/>
<Colum XPath="//Advertisement[@AdvertisementSK = PositionAdvertisementRelationship/@AdvertisementSK]/@AdvertisementSK" Name="AdvertisementSK"/>
<Colum XPath="//Advertisement[@AdvertisementSK = PositionAdvertisementRelationship/@AdvertisementSK]/@AdvertisementTypeSK" Name="Formatvorgabe"/>
</Columns>
</ROOT>
我想要所有带有@和"Name"的名字:位置,Gruppen-Nr,...
所以在 Dic 中(来自我的代码)是 {[@PositionSK, Position]}, {[@PosGroup, Gruppen-Nr]}, ...
那么我怎样才能达到与 XML文档相同的结果?
下一步我有:
foreach (XElement position in positions.Where(e => e.HasAttributes))
{
valueNames.Clear();
headingNames.Clear();
foreach (XAttribute attribute in position.Attributes().Where(a => dict.ContainsKey($"@{a.Name.LocalName}")))
{
string name = attribute.Name.LocalName;
string xName = dict["@" + name];
string value = (string)attribute;
headingNames.Add(xName);
valueNames.Add(value);
}
输出将是 DataGridView 中的 DataTable。
它应该在另一个 xml 文件中搜索带有 @ 的名称并找到它们的值。但是需要 XMLDocument.. 而不是 linq.. 的代码。有人能帮我吗?
一个基本的例子是:
List<string> valueNames = new List<string>();
List<string> headingNames = new List<string>();
XmlDocument doc = new XmlDocument();
doc.Load("data.xml");
for (int r = 0; r < doc.ChildNodes.Count; r++)
{
var currentNode = doc.ChildNodes.Item(r);
if (currentNode.Name.Equals("ROOT"))
{
var columnsNode = currentNode.FirstChild;
for (int i = 0; i < columnsNode.ChildNodes.Count; i++)
{
XmlNode child = columnsNode.ChildNodes.Item(i);
for (int j = 0; j < child.Attributes.Count; j++)
{
var attribute = child.Attributes.Item(j);
if (attribute.Name.Equals("XPath"))
{
headingNames.Add(attribute.Value);
}
else if (attribute.Name.Equals("Name"))
{
valueNames.Add(attribute.Value);
}
}
}
}
}
一些解释:
您的示例 XML 没有 XML 声明,因此我们可以通过访问 FirstChild
属性.
编辑后:您的示例 XML 现在有一个 XML 声明,但模式相同。 For 循环并访问此循环的每个索引器的子元素。
'Columns'元素可以用同样的方法到达。
在 'Columns' 元素上,我们对所有子节点进行 for 循环,并使用循环的索引器 (i) 获取相应的元素。为什么?因为它是一个 XmlNodeList
对象。
对于我们的 XmlNode child
我们做同样的事情,但这次不是子节点。相反,我们遍历属性节点并寻找正确的名称。
嘿,我有两个 xml 文件和以下代码:
DataTable table = new DataTable();
List<string> headingNames = new List<string>();
List<string> valueNames = new List<string>();
//first xml file
XDocument config = XDocument.Load(configFile);
Dictionary<string, string> dict = config.Descendants("Columns").FirstOrDefault().Elements()
.GroupBy(x => (string)x.Attribute("XPath"), y => (string)y.Attribute("Name"))
.ToDictionary(x => x.Key, y => y.FirstOrDefault());
//second xml file
XDocument data = XDocument.Load(dataFile);
List<XElement> positions = data.Descendants("Position").ToList();
但是我得改成XML文档代码
这里是第一个XML:
<?xml version="1.0" encoding="utf-8"?>
<ROOT>
<Columns BaseXPath="//Orders/Position/">
<Colum XPath="@PositionSK" Name="Position"/>
<Colum XPath="@PosGroup" Name="Gruppen-Nr"/>
<Colum XPath="@PosNumber" Name="PositionsNr"/>
<Colum XPath="@PositionCommercialTypeSK" Name="Status"/>
<Colum XPath="@BundlePositionSK" Name="BundlePositionSK"/>
<Colum XPath="@MainPositionSK" Name="MainPositionSK"/>
<Colum XPath="@SalesAgentPrice" Name="Preis"/>
<Colum XPath="@Catchword" Name="Suchwort"/>
<Colum XPath="@ContentComponentCommSK" Name="IKO"/>
<Colum XPath="@PositionTypeSK" Name="PositionsTyp"/>
<Colum XPath="//Advertisement[@AdvertisementSK = PositionAdvertisementRelationship/@AdvertisementSK]/@AdvertisementSK" Name="AdvertisementSK"/>
<Colum XPath="//Advertisement[@AdvertisementSK = PositionAdvertisementRelationship/@AdvertisementSK]/@AdvertisementTypeSK" Name="Formatvorgabe"/>
</Columns>
</ROOT>
我想要所有带有@和"Name"的名字:位置,Gruppen-Nr,...
所以在 Dic 中(来自我的代码)是 {[@PositionSK, Position]}, {[@PosGroup, Gruppen-Nr]}, ...
那么我怎样才能达到与 XML文档相同的结果?
下一步我有:
foreach (XElement position in positions.Where(e => e.HasAttributes))
{
valueNames.Clear();
headingNames.Clear();
foreach (XAttribute attribute in position.Attributes().Where(a => dict.ContainsKey($"@{a.Name.LocalName}")))
{
string name = attribute.Name.LocalName;
string xName = dict["@" + name];
string value = (string)attribute;
headingNames.Add(xName);
valueNames.Add(value);
}
输出将是 DataGridView 中的 DataTable。 它应该在另一个 xml 文件中搜索带有 @ 的名称并找到它们的值。但是需要 XMLDocument.. 而不是 linq.. 的代码。有人能帮我吗?
一个基本的例子是:
List<string> valueNames = new List<string>();
List<string> headingNames = new List<string>();
XmlDocument doc = new XmlDocument();
doc.Load("data.xml");
for (int r = 0; r < doc.ChildNodes.Count; r++)
{
var currentNode = doc.ChildNodes.Item(r);
if (currentNode.Name.Equals("ROOT"))
{
var columnsNode = currentNode.FirstChild;
for (int i = 0; i < columnsNode.ChildNodes.Count; i++)
{
XmlNode child = columnsNode.ChildNodes.Item(i);
for (int j = 0; j < child.Attributes.Count; j++)
{
var attribute = child.Attributes.Item(j);
if (attribute.Name.Equals("XPath"))
{
headingNames.Add(attribute.Value);
}
else if (attribute.Name.Equals("Name"))
{
valueNames.Add(attribute.Value);
}
}
}
}
}
一些解释:
您的示例 XML 没有 XML 声明,因此我们可以通过访问FirstChild
属性.编辑后:您的示例 XML 现在有一个 XML 声明,但模式相同。 For 循环并访问此循环的每个索引器的子元素。
'Columns'元素可以用同样的方法到达。
在 'Columns' 元素上,我们对所有子节点进行 for 循环,并使用循环的索引器 (i) 获取相应的元素。为什么?因为它是一个
XmlNodeList
对象。对于我们的
XmlNode child
我们做同样的事情,但这次不是子节点。相反,我们遍历属性节点并寻找正确的名称。