我真的需要帮助。我有一个具有以下结构的xml文件
<?xml version="1.0" encoding="UTF-8"?>
<Head xmlns="http://www.sample-package.org">
<Number>748</Number>
<Number_confirm>977</Number_confirm>
<Positions>
<Tare_id>2442</Tare_id>
</Positions>
<Positions>
<Product_id>168813</Product_id>
</Positions>
</Head>
我需要在字典中添加键和值(N和“ Number”)(id和Product_id),但是需要没有linq,例如:
//load xml from url
doc.Load(temp);
var root = doc.GetElementsByTagName("Head");
var documents = new List<Dictionary<string, object>>();
for (int i = 0; i <root.Count; i++)
{
for (int j = 0; j < root[i].ChildNodes.Count; j++)
{
var element = root[i].ChildNodes[j];
InfoManager.MessageBox("element:{0}", element.Value);
var document = new Dictionary<string, object>();
document.Add("N", element.Attributes.GetNamedItem("Number"));
document.Add("NC", element.Attributes.GetNamedItem("Number_confirm"));
documents.Add("ID",
element.Attributes.GetNamedItem("Product_id"));
documents.Add(document);
}
}
现在element.Attributes = null,MessageBox显示元素为空,我看不到Attributes / Element并且未将所有元素添加到字典中。我该如何解决?
答案 0 :(得分:1)
1) element
没有任何值。要获取所需的数字,您将必须使用element.InnerText
,如下所示:
MessageBox.Show(string.Format("element:{0}", element.InnerText));
2)然后,您在document.Add
语句中尝试访问属性,但是元素上没有属性。
属性的示例为:
<Number MyAttribute="additionalInfo">67</Number>
3)您的document.Add
陈述之一有错字。您不小心输入了文档 s 一次。
4)在第二个循环中,循环遍历根目录(Head)中的所有元素。因此,您进入循环4次,每次进入一个不同的元素,但是您尝试在每次迭代中添加所有值。您实际上希望像下面这样具有KeyValuePairs
的列表:
var root = doc.GetElementsByTagName("Head");
var documents = new List<KeyValuePair<string, object>>();
for (int i = 0; i < root.Count; i++)
{
for (int j = 0; j < root[i].ChildNodes.Count; j++)
{
var element = root[i].ChildNodes[j];
MessageBox.Show(string.Format("element:{0}", element.InnerText));
var document = new KeyValuePair<string, object>(element.Name, element.InnerText);
documents.Add(document);
}
}
现在字典等于您的xml所具有的结构:一个对象(头)具有一个KeyValuePairs列表(“ Number”对与“ 748”,“ Number_confirm”对与“ 977”,等等)
正如您的注释所建议的,如果您的xml如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<Head xmlns="http://www.sample-package.org">
<Number>748</Number>
<Number_confirm>977</Number_confirm>
<Positions> <!-- Note: two numbers in one Positions-element -->
<Tare_id>2442</Tare_id>
<Product_id>168813</Product_id>
</Positions>
</Head>
..然后,您将不得不添加另一个循环以更深入并更改以下内容:
..
var element = root[i].ChildNodes[j];
MessageBox.Show(string.Format("element:{0}", element.InnerText));
string numbers = string.Empty;
for(int z = 0; z < element.ChildNodes.Count; z++)
{
numbers += element.ChildNodes[z].InnerText + Environment.NewLine;
}
var document = new KeyValuePair<string, object>(element.Name, numbers);
documents.Add(document);
..
尽管如此,我还是建议您创建一个具有xml中类似属性的类,以便您可以加载xml内部文件并随意打印/更改它。
答案 1 :(得分:1)
尝试使用XmlDocument并将其转换为JSON对象。
XmlDocument doc = new XmlDocument();
doc.Load(*XML FILE PATH*);
string XML_JSON = JsonConvert.SerializeXmlNode(doc);
dynamic jsonObject = JsonConvert.DeserializeObject(XML_JSON);
var XML_OBJECT = jsonObject["Head"];
JToken number = (JToken) XML_OBJECT["Number"]
JToken numberConfirm = (JToken) XML_OBJECT["Number_confirm"];
JArray positions = (JArray) XML_OBJECT["Positions"];
然后以您要在字典中添加的方式对其进行迭代。
仅供参考,您的XML文件中没有任何属性。
答案 2 :(得分:1)
您提供的Xml文档的根元素为
,因此foreach循环将始终仅对一个元素以及字典列表进行迭代。但这可能只是一个简短的例子。要获得所需的内容,可以使用XPath这样找到所需的元素:
doc.Load(temp);
XmlNamespaceManager nsMgr = new XmlNamespaceManager(doc.NameTable);
nsMgr.AddNamespace("pkg", "http://www.sample-package.org");
var root = doc.GetElementsByTagName("Head");
var documents = new List<Dictionary<string, object>>();
for (int i = 0; i < root.Count; i++)
{
var head = root[i];
var document = new Dictionary<string, object>();
document.Add("N", head.SelectSingleNode("/pkg:Head/pkg:Number", nsMgr).InnerText);
document.Add("NC", head.SelectSingleNode("/pkg:Head/pkg:Number_confirm", nsMgr).InnerText);
document.Add("ID", head.SelectSingleNode("/pkg:Head/pkg:Positions/pkg:Product_id", nsMgr).InnerText);
documents.Add(document);
}