我正在使用C#和Mono编写一个库,可以为Apple macOS官方词典应用程序生成词典。字典源代码是一个XML文档,它看起来像这样:
{{1}}
问题是,元素的本地名称包含一个冒号,我运行我的代码,当它转到 WriteStartElement 方法时它会抛出异常并告诉我:
'd:dictionary'中的名称字符无效。 “:”字符,十六进制值0x3A,不能包含在名称中。
所以我想问一下,我该如何解决这个问题,并在其中写下带冒号的本地名称?
答案 0 :(得分:1)
请注意,元素本地名称是冒号后的部分,例如dictionary
中的d:dictionary
。冒号前面的部分是名称空间前缀。也就是说,你不想用冒号写出元素本地名称。您想要使用名称空间前缀来编写元素,这可以使用接受三个字符串参数的WriteStartElement()
重载来完成:
string prefix = "d";
string localName = "dictionary";
string namespaceUri = "http://www.apple.com/DTDs/DictionaryService-1.0.rng";
writer.WriteStartElement(prefix, localName, namespaceUri);
参考:MSDN - XmlWriter.WriteStartElement(prefix, localName, namespace)
答案 1 :(得分:1)
我更喜欢使用xml linq,这是一个增强的网络库。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string header =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<d:dictionary xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:d=\"http://www.apple.com/DTDs/DictionaryService-1.0.rng\">" +
"</d:dictionary>";
XDocument doc = XDocument.Parse(header);
XElement dictionary = (XElement)doc.FirstNode;
XNamespace dNs = dictionary.GetNamespaceOfPrefix("d");
XNamespace defaultNs = dictionary.GetDefaultNamespace();
XElement newDict = new XElement(dNs + "entry", new object[] {
new XAttribute("id", "dictionary_application"),
new XAttribute("title","Dictionary application"),
new XElement(dNs + "index", new XAttribute("value", "Dictionary application")),
new XElement(defaultNs + "h1", "Dictionary application"),
new XElement(defaultNs + "p", "An application to look up in dictionary on Mac OS X.")
});
dictionary.Add(newDict);
}
}
}