Не удается извлечь элементы (по имени элемента и атрибуту) - PullRequest
2 голосов
/ 08 марта 2012

У меня есть следующий пример XML, который мне нужно проанализировать для извлечения параметров:

    <?xml version="1.0" encoding="UTF-8"?>
<bulkCmConfigDataFile xmlns:un="utranNrm.xsd"  xmlns:xn="genericNrm.xsd" xmlns:gn="geranNrm.xsd"  xmlns="configData.xsd" 
 xmlns:es="Vendor1SpecificAttributes.1.0.xsd">
    <fileHeader fileFormatVersion="1.0" vendorName="Vendor1"/>
    <configData dnPrefix="Undefined">
        <xn:SubNetwork id="ONRM_ROOT_MO_R">
            <xn:SubNetwork id="RNC0001">
                <xn:MeContext id="BLABLA">
                </xn:MeContext>
                <xn:MeContext id="MACHIN">
                </xn:MeContext>
                <xn:MeContext id="RNC0001">
                    <xn:VsDataContainer id="RNC0001">
                    </xn:VsDataContainer>
                    <xn:ManagedElement id="1">
                        <un:RncFunction id="1">
                            <un:UtranCell id="111111A">
                                <un:attributes>
                                    <un:uarfcnUl>9800</un:uarfcnUl>
                                    <un:uarfcnDl>10700</un:uarfcnDl>
                                </un:attributes>
                                <xn:VsDataContainer id="111111A">
                                    <es:Position>
                                    <es:latitudeSign>1</es:latitudeSign>
                                    <es:latitude>3070727</es:latitude>
                                    <es:longitude>8786820</es:longitude>
                                    </es:Position>
                                </xn:VsDataContainer>
                                <xn:VsDataContainer id="1">
                                </xn:VsDataContainer>
                            </un:UtranCell>
                            <un:UtranCell id="111111B">
                                 <un:attributes>
                                    <un:uarfcnUl>9800</un:uarfcnUl>
                                    <un:uarfcnDl>10700</un:uarfcnDl>
                                </un:attributes>
                                <xn:VsDataContainer id="111111B">
                                    <es:Position>
                                    <es:latitudeSign>1</es:latitudeSign>
                                    <es:latitude>3070555</es:latitude>
                                    <es:longitude>8786666</es:longitude>
                                    </es:Position>
                                </xn:VsDataContainer>
                                <xn:VsDataContainer id="1">
                                </xn:VsDataContainer>
                            </un:UtranCell>
                        </un:RncFunction>
                    </xn:ManagedElement>
                </xn:MeContext>
            </xn:SubNetwork>
        </xn:SubNetwork>
    </configData>
    <fileFooter dateTime="2011-11-28T08:38:45Z"/>
</bulkCmConfigDataFile>             

До сих пор мне удавалось получить только первый элемент по имени для данного пространства имен:

XNamespace xn = "genericNrm.xsd";
XNamespace un = "utranNrm.xsd";
var test1 = xmldoc.Descendants(xn + "MeContext").FirstOrDefault();

, который даст мне только первый элемент "MeContext" (в этом примере это вернет MeContext с id = BLABLA).

Если я попробую следующее вместо

XNamespace xn = "genericNrm.xsd";
XNamespace un = "utranNrm.xsd";
var test1 = xmldoc.Descendants(xn + "MeContext");

test1 будет нулевым ...

1 - Мой первый вопрос - как мне получить определенный элемент, используя его атрибут "id" (в этом конкретном примере я ищу id ="RNC0001").Я пробовал многие вещи, поступающие из stackoverflow, включая следующие:

XNamespace xn = "genericNrm.xsd";
IEnumerable<XElement> utrancells =
                            xmldoc.Root
                                    .Elements(xn + "MeContext")
                                    .Where(el => (string)el.Attribute("id") == "RNC0001");

, который возвращает только нулевые значения.

2 - Вторая проблема заключается в том, как извлечь коллекцию элементов из <xn:MeContext id="RNC0001"></xn:MeContext>?Я хотел бы получить все <un:UtranCell id="XXXXX"></un:UtranCell> (и содержимое) в коллекции, чтобы я мог извлечь данные из каждого из них (каждый из которых представляет отдельную сущность).Например, мне нужно получить

<es:latitude>3070555</es:latitude>
<es:longitude>8786666</es:longitude>

от каждого <un:UtranCell id="XXXXX"></un:UtranCell>

. Для этого я попытался (в качестве теста):

XNamespace un = "utranNrm.xsd";
var test3 = xmldoc.Elements(un + "UtranCell");
var test4 = test1.Elements(un + "UtranCell");

и снова он возвращает тольконулевые значения ...

Редактировать для Даниэля: Реальный код:

public void parseFile()
{
    XNamespace xn = "genericNrm.xsd";
    XNamespace un = "utranNrm.xsd";
    XNamespace cd = "configData.xsd";

    var test1 = xmldoc.Descendants(xn + "MeContext").FirstOrDefault();
    var test1bis = xmldoc.Descendants(xn + "MeContext");
}

Это дает мне: test1 = <xn:MeContext id="BLABLA" xmlns:xn="genericNrm.xsd"></xn:MeContext>

test1bis = {System.Xml.Linq.XContainer.GetDescendants} |имя = ноль

1 Ответ

1 голос
/ 08 марта 2012

Проблема в обоих случаях в том, что вы используете Elements вместо Descendants.Разница в том, что Elements возвращает только те элементы, которые являются непосредственными дочерними элементами - то есть на один уровень глубиной, тогда как Descendants ищет все поддерево.Попробуйте вместо этого:

IEnumerable<XElement> utrancells =
    xmldoc.Root
          .Descendants(xn + "MeContext")
          .Where(el => (string)el.Attribute("id") == "RNC0001");
...