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");
}

由于第二行的“[”字符,这会引发异常。该字符是文档中实体列表的左括号。

我能想到的唯一方法是在打开文档时将 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 解析器不是因为你有DOCTYPE声明而抱怨,而是因为你有不正确 DOCTYPE的声明而抱怨。根据 XML 规范 PUBLIC,后面必须跟两个字符串(“PubidLiteral”和“SystemLiteral”),而不仅仅是一个。

但我认为尝试修复文件没有意义,因为它包含以下部分:

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

在 SGML(和 HTML)中,这样的未闭合标签是可以的,但在 XML 中是不允许的。因此,我认为您不应该尝试使用 LINQ to XML 来解析此文件,因为它确实不是 XML。

XmlReader但是,如果您可以使用可以实际读取 SGML的实现,那么使用 LINQ to XML 将是有意义的。Alex Filipovici 在评论中提到的 SGMLReader似乎正是如此。

于 2013-02-19T17:40:42.100 回答
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 1.0 Recommendations以创建有效的 XML 文件。

于 2013-02-19T15:30:22.080 回答