2015-09-17 3 views
1

Я относительно новичок в использовании классов XML C#. Я даже не могу заставить читателя XML признать, что строка, которую я передаю ему, - это XML. Вот мой блок тест, который я использую, чтобы проверить основную Xml чтенияXmlReader.HasAttributes возвращает false сразу после создания

[TestFixture()] 
public class LegacyWallTests 
{ 
    [Test()] 
    public void ReadLegacyWallFile() 
    { 
     var legacyWallText = legacyfiles.legacywall1; 
     { 
      string xmlString = legacyfiles.legacywall1; 
      using (XmlReader reader = XmlReader.Create(new StringReader(xmlString))) 
      { 
       reader.HasAttributes.Should().BeTrue(); 
      } 
     } 
    } 
} 

А вот XML Я пытаюсь читать

<Wall> 
    <Actual> 
    <Specifications> 
     <Insertion> 375.6858 916.8871 0.0000 </Insertion> 
     <Angle> 3.14159 </Angle> 
     <WallDesc> E4-1, H: 8' 1 1/8, Sh: Yes, S: 2~4~2~9-0-0~SPF~~, Spc: Single @ 16 in OC, BP: 2~4~2~12-0-0~SYP~~, CP: 2~4~2~12-0-0~SYP~~, TP: 2~4~2~12-0-0~SYP~~,\P LI: Single @ 38.75000000, CB: No, VB: No, NCT: 2~4~2~9-0-0~SPF~~, CT: 2~4~2~9-0-0~SPF~~, Pac: 2~4~2~9-0-0~SPF~~, Mir: Yes </WallDesc> 
     <WallNum> 1 </WallNum> 
     <VaporBarrier></VaporBarrier> 
    </Specifications> 
    </Actual> 
</Wall> 

legacyfiles.legacywall1 это имя файла XML Я добавил ресурсы моего проекта. Я знаю, что xml-файл читается, потому что вывод этой строки в консоль дает мне xml из файла. Однако, когда я создаю XmlReader и проверяю, что есть атрибуты, он говорит, что их нет. Я не знаю, что я делаю неправильно.

+2

Чтобы ответить на ваш точный вопрос «что я делаю неправильно» - не проверять документацию и не предоставлять хороший заголовок вашему сообщению. –

+0

Сторона примечания: XML в сообщении имеет * отсутствие атрибутов *, поэтому даже если вы действительно прочитаете его, никогда не будет случая, когда 'HasAttributes' истинно - вы можете обновить сообщение, чтобы показать XML с атрибутами. –

+0

Приложение, которое я пишу, должно читать XML, так как мне нужен метод, который может читать этот XML как ... –

ответ

5

XmlReader.HasAttribute возвращает true, если текущий узел имеет атрибуты. Когда вы не продвигаетесь в документ, читатель начинает с корневого элемента <Wall>, который не имеет атрибутов. И никаких других элементов.

Атрибут bar в <foo bar="baz" />.

Вы также, как правило, не хотите связываться с XML с помощью читателей. Получите или создайте XSD (также очень полезную для проверки ввода), сгенерируйте класс из этого XSD и десериализуйте входящий XML в экземпляр этого класса. Затем вы можете просто получить доступ к wall.Actual.Specifications[0].WallDesc.

+0

Итак, если бы я хотел продолжить использование Reader, как бы получить строку между тегами ? –

+1

@Nick см. [Как я могу прочитать определенные элементы из XML-строки, используя XMLREADER в C#] (http://stackoverflow.com/questions/8888806/), [Анализ синтаксиса элементов XML в XmlReader] (http://stackoverflow.com/вопросы/243022 /). Последний, XPath, является предпочтительным. – CodeCaster

+0

Этот XML настроен иначе, чем мой. Он имеет атрибуты. В моем приложении я должен прочитать XML как есть, я не могу его изменить –

Смежные вопросы