Как получить ВСЕ вхождения элемента в потомках в XML - PullRequest
1 голос
/ 10 марта 2020

Итак, я сделал кое-что, чтобы получить все элементы многоугольника в файле XML и затем нарисовать многоугольники, но когда я нарисовал их, я понял, что мне не хватает многих элементов многоугольников.

Код Я использую, чтобы получить элементы многоугольника

List<XElement> hs1 = doc.Descendants("signal")
                .Where(x => (x.Element("contactref") != null) && (x.Element("contactref")
                .Attribute("element") != null) && ((string)x.Attribute("name") != "EPD_PWR") && ((string)x.Element("contactref")
                .Attribute("element") == "HS1") && x.Element("polygon") != null)
                .Select(x => x.Element("polygon")).ToList();            .Select(x => x.Element("polygon")).ToList();

Затем я делаю foreach и прочее, чтобы получить все элементы вершины внутри многоугольника.

foreach (XElement item in hs1)
            {
                int counter = 0;
                List<string> vx = new List<string>(), vy = new List<string>();

                if (item != null)
                {
                    foreach (XElement vert in item.Elements())
                    {
                        vx.Add(vert.Attribute("x").Value.ToString());
                        vy.Add(vert.Attribute("y").Value.ToString());

                        counter++;
                    }//Foreach
                }//IF
                points = new PointF[counter];
                for (int i = 0; i < vx.Count; i++)
                {
                    points[i].Y = (float.Parse(vx[i].Replace(".", ",")) * 10) / 2;
                    points[i].X = (float.Parse(vy[i].Replace(".", ",")) * 10);
                }//For

Это работает нормально, но потом я Я понял, что получаю только потомственный элемент многоугольника у потомков, а не у всех, потому что у некоторых потомков больше одного элемента многоугольника. т.е.

<signals>
 <signal name="N$1">
  <contactref element="HS1" pad="1"/>
  <polygon width="0.05" layer="1">
   <vertex x="0" y="0"/>
   <vertex x="83" y="0"/>
   ...
  </polygon>
 </signal>
 <signal name="N$2">
  <contactref element="HS1" pad="2"/>
  <polygon width="0.05" layer="1">
   <vertex x="33.638" y="8.084"/>
   <vertex x="33.571" y="7.927"/>
   ...
  </polygon>
  <polygon width="0.05" layer="1">
   <vertex x="21.496" y="23.739"/>
   <vertex x="21.607" y="23.604"/>
  </polygon>
 </signal>
</signals>

Так что в приведенном выше примере XML я хочу получить ВСЕ "полигональные" элементы в "сигнале", но я получаю только первый с моим кодом.

Где это идет не так? В моем do c .descendants или это в моих циклах foreach?

Заранее спасибо

1 Ответ

1 голос
/ 10 марта 2020

Вы должны вызывать Элементы вместо Элемента в последней строке здания hs1.

Принимая во внимание комментарий @Bradley Uffner, если вам нужен плоский список полигонов, вы можете заменить Select на SelectMany.

List<XElement> hs1 = doc.Descendants("signal")
                .Where(x => (x.Element("contactref") != null) && (x.Element("contactref")
                .Attribute("element") != null) && ((string)x.Attribute("name") != "EPD_PWR") && ((string)x.Element("contactref")
                .Attribute("element") == "HS1") && x.Element("polygon") != null)
                .SelectMany(x => x.Elements("polygon")).ToList(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...