Я работаю с этим XSD-файлом. Часть XML, относящаяся к этому вопросу, находится здесь:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="https://wsmrc2vger.wsmr.army.mil/rcc/manuals/106-11"
targetNamespace="https://wsmrc2vger.wsmr.army.mil/rcc/manuals/106-11"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:element name="Tmats">
<xs:complexType>
<xs:sequence>
<xs:annotation>
<xs:documentation>TMATS G Group</xs:documentation>
</xs:annotation>
<xs:element name="ProgramName" type="xs:string" minOccurs="0">
<xs:annotation>
<xs:documentation>PN</xs:documentation>
</xs:annotation>
</xs:element>
Чтобы получить значение documentation
для данногоxs:element
, у меня есть эта маленькая функция, которая рекурсивно обходит узлы-потомки, пока не найдет элемент documentation
:
public string GetCode(XElement e)
{
foreach (var s in e.Elements())
{
// If we hit an intervening element, bail out.
if (s.Name.ToString().Contains("element"))
return "";
if (s.Name.ToString().Contains("annotation"))
{
// I'll explain this loop in a moment.
foreach (var t in s.Elements())
{
if (t.Name.ToString().Contains("documentation"))
return t.Value;
}
}
else
return GetCode(s);
}
return "";
}
Пока все хорошо.Модульный тест выглядит так:
[TestMethod()]
public void GetCodeTest()
{
string path = @"C:\Documents and Settings\harvey robert\Desktop\Tmats.xsd";
IEnumerable<XElement> elements =
from e in XElement.Load(path).Elements()
select e;
TmatsDictionary target = new TmatsDictionary();
XElement x = elements.First();
string actual = target.GetCode(x);
Assert.AreEqual("TMATS G Group", actual);
}
Что проходит.Теперь я хочу расширить тест, добавив дополнительный регистр, например:
XElement z = elements.DescendantsAndSelf()
.First(y => y.Attribute("name")
.ToString().Contains("ProgramName"));
actual = target.GetCode(z);
Assert.AreEqual("PN", actual);
... Но это не удалось из-за пустой ссылки на объект (наиболее вероятно y.Attribute("name")
).
Вы видели цикл в функции выше, которую я прокомментировал?
// I'll explain this loop in a moment.
foreach (var t in s.Elements())
{
if (t.Name.ToString().Contains("documentation"))
return t.Value;
}
Это написано так, потому что Я не могу понять, как выразить условие вЛямбда-оператор, который работает.
Есть предложения?