我是XML的新手,我现在正在尝试读取xml文件。 我用Google搜索并尝试这种方式来读取xml,但是我收到了这个错误。
参考未宣布的实体'Ccaron'。第2902行,第9位。
当我去2902行时,我得到了这个,
<H0742>Čopova 14, POB 1725,
SI-1000 Ljubljana</H0742>
这是我尝试的方式
XmlDocument xDoc = new XmlDocument();
xDoc.Load(file);
XmlNodeList nodes = xDoc.SelectNodes("nodeName");
foreach (XmlNode n in nodes)
{
if (n.SelectSingleNode("H0742") != null)
{
row.IrNbr = n.SelectSingleNode("H0742").InnerText;
}
.
.
.
}
当我看到w3school时, &amp;在xml中是非法的 。
编辑: 这是编码。我不知道它与xml有什么关系。
编码= 'ISO-8859-1'
提前致谢。
编辑:
他们给了我一个 .ENT 文件,我可以在线参考ftp.MyPartnerCompany.com/name.ent。 在这个.ENT文件中 我看到像这样的实体
<!ENTITY Cacute "Ć"> <!-- latin capital letter C with acute,
U+0106 Latin Extended-A -->
如何在我的xml解析中引用它? 我更喜欢在线参考,因为他们可以随时添加新内容。 在此先感谢!!!
答案 0 :(得分:3)
首先要注意的是问题不在您的软件中。
由于您不熟悉XML,我猜猜定义实体不是您之前遇到过的。字符实体是任意文本片段(一个或多个字符)的快捷方式。您将看到它们最常见的地方就是您现在所处的情况。在某些时候,您的XML是由想要输入字符'Č'或'č'的人创建的(如果您的字体无法显示,则使用Caron的大写和小写C)。
然而,在XML中我们只有几个预先声明的实体(&符号,小于,大于,双引号和撇号)。需要声明任何其他字符实体。为了正确解析您的文件,您需要执行以下两项操作之一 - 将字符实体替换为不会导致解析器发布的内容或声明实体。
要声明实体,您可以使用称为“内部子集”的东西 - 您可能在XML文件顶部看到的DTD语句的特殊形式。像这样:
<!DOCTYPE root-element
[ <!ENTITY Ccaron "Č">
<!ENTITY ccaron "č">]
>
将该语句放在XML文件的开头(更改'root-element'以匹配你的文件)将允许解析器解析实体。
或者,只需将Č
更改为Č
,您的问题也将得到解决。
&#
表示法是一个数字实体,为字符提供适当的unicode值('x'表示它是十六进制的。)
您也可以随时输入字符,但需要了解键盘和区域的细节。
答案 1 :(得分:2)
Č
不是XML,甚至没有在HTML 4实体引用中定义。哪个btw不是XML。 XML不支持所有这些实体,事实上,它只支持很少的实体,但是如果你查找实体并找到它,你就可以使用它的Unicode等价物,你可以使用它。例如Š
是无效的XML,但Š
不是。 (Scaron
是我能找到Ccaron
}的最接近的地方。
答案 2 :(得分:1)
您的XML文件格式不正确,因此不能用作XmlDocument。周期。
您有两种选择:
System.Xml
生成该文件,但可能会连接多个字符串,因为“XML只是一个文本文件”。您应该修复它,或者打开生成的XML文件总是一件令人意外的事。 编辑:由于无法修复XML生成器,我建议使用File.ReadAllText
打开它并执行正则表达式重新编码&
或者剥离整个实体(因为我们无法翻译)
Console.WriteLine(
Regex.Replace("<H0742>Čopova 14, { POB & SI-1000 &</H0742>",
@"&((?!#)\S*?;)?", match =>
{
switch (match.Value)
{
case "<":
case ">":
case "&":
case """:
case "'":
return match.Value; // correctly encoded
case "&":
return "&";
default: // here you can choose:
// to remove entire entity:
return "";
// or just encode that & character
return "&" + match.Value.Substring(1);
}
}));
答案 3 :(得分:1)
Č
是实体参考。实体引用很可能是针对字符Č,以便生成:Čopova
。
但是,that entity must be declared或XML解析器在解析XML时不知道应该替换实体引用的内容。
答案 4 :(得分:0)
解决方案: -
byte[] encodedString = Encoding.UTF8.GetBytes(xml);
// Put the byte array into a stream and rewind it to the beginning
MemoryStream ms = new MemoryStream(encodedString);
ms.Flush();
ms.Position = 0;
// Build the XmlDocument from the MemorySteam of UTF-8 encoded bytes
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(ms);