2

現在構造化されているが厳密には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");
}

これにより、2 行目の '[' 文字が原因で例外がスローされます。この文字は、ドキュメント内のエンティティのリストの開始ブラケットです。

これを機能させるために考えられる唯一の方法は、ドキュメントを開くときにドキュメントの先頭に 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>
4

2 に答える 2

0

この場合の問題は、xml 宣言が必要なことではなく、2行目から6行目までの内容です。実際には、それらは有効な 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 の推奨事項については、こちらを参照してください。

于 2013-02-19T15:30:22.080 に答える
0

XML パーサーは、宣言があるために不平を言っているDOCTYPEのではなく、宣言が正しくない DOCTYPEために不平を言っています。XML 仕様によると、 PUBLIC 1 つだけでなく 2 つの文字列 (「PubidLiteral」と「SystemLiteral」) が続く必要があります。

しかし、次のようなセクションが含まれているため、ファイルを修正しようとしても意味がないと思います。

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

このような閉じられていないタグは、SGML (および HTML) では問題ありませんが、XML では許可されていません。そのため、このファイルは実際には XML ではないため、LINQ to XML を使用してこのファイルを解析するべきではないと思います。

XmlReaderしかし、実際に SGML を読み取ることができる実装を使用できるのであれば、LINQ to XML を使用することは理にかなっています。そして、Alex Filipovici のコメントで言及されているSGMLReaderは、まさにそのようです。

于 2013-02-19T17:40:42.100 に答える