2013-04-28 3 views
1

Я очень новичок в XML и LINQ. Я прочитал несколько руководств по XML для LINQ, но ни один из XML-документов, похоже, не отформатирован так, как мой. Я не уверен, что (и как) он меняет ситуацию.XML для LINQ с метаданными

Все примеры, которые я прочитал в Интернете, кажется, имеют следующий формат:

<data> 
<row> 
    <Term>201320</Term> 
    <Subj>ACCT</Subj> 
    <Subj_desc>Accounting</Subj_desc> 
</row> 
<row> 
    <Term>201320</Term> 
    <Subj>ACCT</Subj> 
    <Subj_desc>Accounting</Subj_desc> 
</row> 
</data> 

Если бы я хотел прочитать, что я думаю, что код будет выглядеть примерно так:

XDocument document = XDocument.Load("URLHERE.xml"); 

var term = from row in document.Descendants("row") 
select new 
{ 
Term = row.Element("Term").Value, 
Subject = row.Element("Subj").Value, 
Subject_Description = row.Element("Subj_desc").Value, 
}; 

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

Вот пример моего XML-документа:

<metadata> 
    <item name="TERM" type="xs:string" length="128"/> 
    <item name="SUBJ" type="xs:string" length="128"/> 
    <item name="SUBJECT_DESC" type="xs:string" length="512"/> 
</metadata> 
<data> 
<row> 
    <value>201320</value> 
    <value>ACCT</value> 
    <value>Accounting</value> 
</row> 
<row> 
    <value>201320</value> 
    <value>ACCT</value> 
    <value>Accounting</value> 
</row> 
</data> 

Как бы извлечь из него данные?

var term = from row in document.Descendants("row") 
select new 
{ 
Term = row.Element("value").Value, 
Subject = row.Element("value").Value, 
}; 

Не кажется правильным. Я использую C# BTW (не уверен, что мне нужно сказать это, или если тег достаточно).

ответ

0

Ваш XML не правильно отформатирован, вам нужен корневой элемент, который инкапсулирует весь документ. такие как

<?xml version='1.0' encoding='utf-8'?> 
<root> 
<metadata> 
    <item name="TERM" type="xs:string" length="128"/> 
    <item name="SUBJ" type="xs:string" length="128"/> 
    <item name="SUBJECT_DESC" type="xs:string" length="512"/> 
</metadata> 
<data> 
<row> 
    <value>201320</value> 
    <value>ACCT</value> 
    <value>Accounting</value> 
</row> 
<row> 
    <value>201320</value> 
    <value>ACCT</value> 
    <value>Accounting</value> 
</row> 
</data> 
</root> 

Затем с помощью XDocument вы можете загрузить файл

var doc = XDocument.Load("file.xml"); 

, то вы можете извлечь данные, своего рода зависит, что вы хотите извлечь, вы никогда не указано. Пример получения метаданных

var item = doc.Descendants("metadata"); 

получать строки, содержащий IEnumerable значений

XDocument document = XDocument.Load("c:\\tmp\\test.xml"); 
var rows = from i in document.Descendants("row") 
      select new {values = i.Elements("value").Select(a=>a.Value)}; 
+0

Относительно неправильно отформатированный документ XML, оригинал правильно, слева, что от моего образца случайно. Я пытаюсь извлечь что-нибудь между тегами . В конце концов, я либо хочу запустить запрос в XML, либо выбросить все это в список (я еще не решил, пока). – rayden54

+0

Последний запрос LINQ в моем ответе даст IEnumerable of Row. При перечислении через них у вас есть IEnumerable вызываемые значения, содержащие 3 значения для этой строки. Поскольку элементы значения не имеют атрибутов, их невозможно идентифицировать как «Термин», «Тема» и т. Д., Они являются всего лишь элементами значения. Если у вас есть контроль над тем, как выглядит XML, добавление атрибута даст вам гораздо более приятный результат при запросе его – James