簡體   English   中英

Linq to XML查詢結構化文檔

[英]Linq to XML query on structured document

我正在嘗試找出如何在當前結構化但不是嚴格XML文件的文件上使用Linq to XML。 它們是格式正確的文件,但不包含XML聲明。 它們實際上是SGML文件。

目前,我有:

private void Find_element_attribute_Click(object sender, EventArgs e)
{
     if (comboBox2.Text != "")
     {
         string[] projectFiles = Directory.GetFiles(path, typeExtention, SearchOption.AllDirectories);

         foreach (string file in projectFiles)
         {  
             XElement root = XElement.Load(file); 
             IEnumerable<XElement> selectedElement = from el in root.Elements(Element_textBox.Text)
                  where (string)el.Attribute(Attribute_textBox.Text) == Value_textBox.Text
                  select el; //need to selct the DMC and title and put in a variable, and list them

             foreach (XElement el in selectedElement)
                 MessageBox.Show("text" + el);
         }

     }
     MessageBox.Show("Please select a project to query");
}

由於第二行中有'['字符,因此拋出異常。 此字符是文檔中實體列表的開頭括號。

我能想到的唯一方法是在打開文檔時在文檔的開頭添加XML聲明,然后使用Linq查詢文檔,然后刪除聲明。 但是我不知道如何去做。 任何幫助表示贊賞。

我的文檔開始看起來像

<!--Arbortext, Inc., 1988-2009, v.4002-->
<!DOCTYPE DMODULE PUBLIC "-//AECMA CSDB//DTD Air Vehicle Engines Equipment Description 19980102//EN" [
<!ENTITY ICN-BR8412XXXXXXX-1CX-AG30000-A-K7626-01966-A01-1 SYSTEM "ICN-BR8412XXXXXXX-1CX-AG30000-A-K7626-01966-A01-1.cgm" NDATA cgm>
<!ENTITY ICN-BR8412XXXXXXX-1CX-AG30000-A-K7626-01964-A01-1 SYSTEM "ICN-BR8412XXXXXXX-1CX-AG30000-A-K7626-01964-A01-1.cgm" NDATA cgm>
<!ENTITY ICN-BR8412XXXXXXX-1CX-AG30000-A-K7626-01963-A01-1 SYSTEM "ICN-BR8412XXXXXXX-
]>
<dmodule><idstatus>
<dmaddres>
<dmc><avee><modelic>XXXXXXAXXXXXX</modelic><sdc>1AX</sdc><chapnum>AG3</chapnum>
<section>0</section><subsect>0</subsect><subject>00</subject><discode>01</discode>
<discodev>00</discodev><incode>018</incode><incodev>A</incodev><itemloc>A
</itemloc></avee></dmc>
<dmtitle><techname>Equipment - INTRODUCTION</techname><infoname>Introduction
</infoname>
</dmtitle>
<issno issno="001" type="new">
<issdate year="2012" month="11" day="30"></dmaddres>
<status>
<security class="3">
<rpc> </rpc>
<orig> </orig>
<applic></applic>
<techstd>
<autandtp>
<authblk>Chap 1</authblk>
<tpbase>8412(A)</tpbase>
</autandtp>
<authex></authex>
<notes></notes>
</techstd>
<qa>
<firstver type="tabtop"></qa>
</status>
</idstatus><content>
<refs>
<norefs></refs>
<descript>
<para0><title>INTRODUCTION</title>

在這種情況下,問題不在於它需要一個xml聲明,而是第二行到第六行的內容。 實際上,由於它們不是有效的xml,因此您的代碼無法解析它們。 一個棘手的方法可能是跳過這些行:

string content = String.Join("", File.ReadAllLines().Skip(6).ToArray());
MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(content));
XElement root = XElement.Load(ms);

然后,如果該內容后跟有效的xml,那么您應該不會有任何其他問題,但是按照我的嘗試,它似乎是無效的。

在此處查找有關創建有效XML文件的XML 1.0建議

XML解析器不會因為您有DOCTYPE聲明而抱怨,而是因為您有不正確的 DOCTYPE聲明而抱怨。 根據XML規范, PUBLIC必須緊跟兩個字符串(“ PubidLiteral”和“ SystemLiteral”),而不僅僅是一個。

但我認為嘗試修復該文件沒有意義,因為它包含以下部分:

<qa>
<firstver type="tabtop"></qa>

在SGML(和HTML)中可以使用未關閉的標簽,但是在XML中則不允許。 因此,我認為您不應該嘗試使用LINQ to XML來解析此文件,因為它實際上不是XML。

但是,如果可以使用實際上可以讀取SGML的XmlReader實現,則可以使用LINQ to XML。 Alex Filipovici在評論中提到的SGMLReader似乎正是這樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM