Как прочитать XML-файл и записать в словарь - PullRequest
0 голосов
/ 21 ноября 2018

Мне действительно нужна помощь.У меня есть 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 и «Число»), (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 показывает пустой элемент, я не вижу атрибутов / элементов и не добавляет все элементы в словарь.Как я могу это исправить ??

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

Попробуйте использовать 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-файле.

0 голосов
/ 21 ноября 2018

В предоставляемом вами 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);
}
0 голосов
/ 21 ноября 2018

1) Значение element не имеет значения.Чтобы получить числа, которые вы ищете, вы должны будете использовать element.InnerText как в:

MessageBox.Show(string.Format("element:{0}", element.InnerText));

2) Затем в document.Add -Statements вы пытаетесьполучить доступ к атрибутам, но нет никаких атрибутов на ваших элементах.

Примером атрибута может быть:

<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: У объекта (Head) есть список 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распечатайте / измените его по вашему желанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...