XElement 节点和子节点
XElement Nodes and child nodes
如果这个问题被重复了,我很抱歉进阶,但根据我的搜索,我的特定错误没有任何合适的答案。
所以对于这个问题,我目前有一份 excel 文档,其中有几行 XML 分布在 sheet 中。我目前正在做的是在 C# 中创建一个控制台应用程序,然后将 XML 过滤为可读数据。我目前能够提取文档内容,现在我 运行 通过代码分解数据。
所以对于 xml 结构:
xml 有几个字段,每个字段内有一个标签和值字段。因此,我采用了创建所有节点列表 (e.g.fields) 并尝试使用 XElement 提取数据的方法。我也知道所有的标签,所以我要做的是使用标签来尝试收集值。
foreach(DataRow row in result.Tables[0].Rows)
{
var XmlData = row.ItemArray[2].ToString();
XElement doc = XElement.Parse(XmlData);
foreach (XElement element in doc.Elements("fields"))
{
var userEntry = new FieldEntryModel();
//element.Value.ToList();
var elementNodes = element.Nodes().ToList();
var nodeBreakdown = element.Nodes().OfType<XElement>();
foreach (var something in nodeBreakdown)
{
var willthiswork = something.DescendantNodes().OfType<XElement>();
foreach (var item in willthiswork) {
if (item.Value != null)
{
if (item.Value.ToString().Contains("Forename"))
//Console.WriteLine(item..ToString());
//userEntry.Forename = item.Value.ToString();
}
}
}
}
我开始混淆命名转换和获取数据的对象类型。
样本 XML:
<fields>
<field>
<label>
Name
<label>
<value>
Test
</value>
</field>
<field>
<label>
job
<label>
<value>
developer
</value>
</field>
<field>
<label>
address
<label>
<value>
1 Test
</value>
</field>
<field>
<label>
Name
<label>
<value>
Test
</value>
</field>
</fields>
然后我会将这些数据存储在我的字段输入模型中,因此:
public class FieldEntryModel
{
public string Name {get;set;}
public string Job {get;set;}
public string Address{get;set;}
}
我相信这样的事情可能对你有用。由于您的字段中似乎有重复的标签(例如“”出现两次),我使用 FirstOrDefault here. You should investigate why there are duplicates and handle appropriately. If there were no duplicates, SingleOrDefault 会是更好的选择。
var fieldElements = doc.Elements("fields").Elements("field");
var nameElement = fieldElements.FirstOrDefault(e => e.Element("label")?.Value == "Name");
var jobElement = fieldElements.FirstOrDefault(e => e.Element("label")?.Value == "job");
var addressElement = fieldElements.FirstOrDefault(e => e.Element("label")?.Value == "address");
var model = new FieldEntryModel
{
Name = nameElement?.Element("value")?.Value,
Job = jobElement?.Element("value")?.Value,
Address = addressElement?.Element("value")?.Value,
};
请注意,我在此使用了 C# 6 (Visual Studio 2015+) 中的 null-conditional operator。
如果这个问题被重复了,我很抱歉进阶,但根据我的搜索,我的特定错误没有任何合适的答案。
所以对于这个问题,我目前有一份 excel 文档,其中有几行 XML 分布在 sheet 中。我目前正在做的是在 C# 中创建一个控制台应用程序,然后将 XML 过滤为可读数据。我目前能够提取文档内容,现在我 运行 通过代码分解数据。
所以对于 xml 结构:
xml 有几个字段,每个字段内有一个标签和值字段。因此,我采用了创建所有节点列表 (e.g.fields) 并尝试使用 XElement 提取数据的方法。我也知道所有的标签,所以我要做的是使用标签来尝试收集值。
foreach(DataRow row in result.Tables[0].Rows)
{
var XmlData = row.ItemArray[2].ToString();
XElement doc = XElement.Parse(XmlData);
foreach (XElement element in doc.Elements("fields"))
{
var userEntry = new FieldEntryModel();
//element.Value.ToList();
var elementNodes = element.Nodes().ToList();
var nodeBreakdown = element.Nodes().OfType<XElement>();
foreach (var something in nodeBreakdown)
{
var willthiswork = something.DescendantNodes().OfType<XElement>();
foreach (var item in willthiswork) {
if (item.Value != null)
{
if (item.Value.ToString().Contains("Forename"))
//Console.WriteLine(item..ToString());
//userEntry.Forename = item.Value.ToString();
}
}
}
}
我开始混淆命名转换和获取数据的对象类型。
样本 XML:
<fields>
<field>
<label>
Name
<label>
<value>
Test
</value>
</field>
<field>
<label>
job
<label>
<value>
developer
</value>
</field>
<field>
<label>
address
<label>
<value>
1 Test
</value>
</field>
<field>
<label>
Name
<label>
<value>
Test
</value>
</field>
</fields>
然后我会将这些数据存储在我的字段输入模型中,因此:
public class FieldEntryModel
{
public string Name {get;set;}
public string Job {get;set;}
public string Address{get;set;}
}
我相信这样的事情可能对你有用。由于您的字段中似乎有重复的标签(例如“”出现两次),我使用 FirstOrDefault here. You should investigate why there are duplicates and handle appropriately. If there were no duplicates, SingleOrDefault 会是更好的选择。
var fieldElements = doc.Elements("fields").Elements("field");
var nameElement = fieldElements.FirstOrDefault(e => e.Element("label")?.Value == "Name");
var jobElement = fieldElements.FirstOrDefault(e => e.Element("label")?.Value == "job");
var addressElement = fieldElements.FirstOrDefault(e => e.Element("label")?.Value == "address");
var model = new FieldEntryModel
{
Name = nameElement?.Element("value")?.Value,
Job = jobElement?.Element("value")?.Value,
Address = addressElement?.Element("value")?.Value,
};
请注意,我在此使用了 C# 6 (Visual Studio 2015+) 中的 null-conditional operator。