У меня есть следующий пример 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} |имя = ноль