簡體   English   中英

使用命名空間和重復節點讀取 XML

[英]Reading XML with namespace and repeating nodes

我有以下 XML:

<resource>
  <description>TTT</description>
  <title>TEST</title>
  <entity xmlns="TdmBLRuPlUz.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="TdmBLRuPlUz.xsd TdmBLRuPlUz.xsd">
    <UzdProd>
      <row>
        <F_DAUDZ>50</F_DAUDZ>
        <BR_DAUDZ/>
        <DAUDZ>50</DAUDZ>
        <U_DAUDZ/>
        <NKODS>ST2.0_014_023</NKODS>
      </row>
    </UzdProd>
    <UzdMat>
      <row>
        <NKODS>SAG 2.0_014_150</NKODS>
        <NNOSAUK>Sagatave 2.0mm*0.14*150m</NNOSAUK>
        <PK_VIEN>1</PK_VIEN>
        <DAUDZ>0.077</DAUDZ>
        <F_DAUDZ>0.077</F_DAUDZ>
      </row>
    </UzdMat>
  </entity>
</resource>

這是我的 C# 代碼:

XNamespace ns = "TdmBLRuPlUz.xsd";
XDocument doc = XDocument.Parse(xml);

foreach (XElement element in doc.Descendants(ns + "row"))
{
    Console.WriteLine(element.Element(ns + "NKODS").Value);
    string NKODS = element.Element(ns + "NKODS").Value;
    string F_DAUDZ = element.Element(ns + "F_DAUDZ").Value;
    string DAUDZ = element.Element(ns + "DAUDZ").Value;
}

我需要的是從 XML 節點NKODSF_DAUDZDAUDZ讀取值。

問題是存在具有這些名稱的重復節點,並且通過此代碼,它為我提供了UzdMat節點下的最后一個節點。 UzdProd下獲取這些節點的值的方法是什么?
我試圖將row更改為UzdProd ,但這沒有用。

您需要閱讀所需的特定行,而不是遍歷所有行。 例如:

var prodRow = doc.Descendants(ns + "UzdProd").Elements(ns + "row").Single();
var matRow = doc.Descendants(ns + "UzdMat").Elements(ns + "row").Single();

var prodNkods = (string) prodRow.Element(ns + "NKODS");
var matNkods = (string) matRow.Element(ns + "NKODS");

有關工作演示,請參閱此小提琴

看看這是否有效:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication25
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            XElement entity = doc.Descendants().Where(x => x.Name.LocalName == "entity").FirstOrDefault();
            XNamespace ns = entity.GetDefaultNamespace();

            var results = entity.Elements().Select(x => new {
                uzd = x.Name.LocalName,
                dict = x.Descendants(ns + "row").Elements().GroupBy(y => y.Name.LocalName, z => (string)z)
                   .ToDictionary(y => y.Key, z => z.FirstOrDefault())
            }).ToList();

        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM