如何读取xml文件并写入字典

时间:2018-11-21 08:51:57

标签: c# xml parsing

我真的需要帮助。我有一个具有以下结构的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并且未将所有元素添加到字典中。我该如何解决?

3 个答案:

答案 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);
}