2016-10-16 10 views
0

私はC#とMonoを使って、Apple macOS公式辞書の辞書を生成するライブラリを作成しています。辞書のソースコードは、XML文書であり、それは次のようになります。C# - コロン記号( ":")はXmlWriterで使用できませんか?

<?xml version="1.0" encoding="UTF-8"?> 
<!-- 
    This is a sample dictionary source file. 
    It can be built using Dictionary Development Kit. 
--> 
<d:dictionary xmlns="http://www.w3.org/1999/xhtml" xmlns:d="http://www.apple.com/DTDs/DictionaryService-1.0.rng"> 
<d:entry id="dictionary_application" d:title="Dictionary application"> 
    <d:index d:value="Dictionary application"/> 
    <h1>Dictionary application </h1> 
    <p> 
     An application to look up dictionary on Mac OS X.<br/> 
    </p> 
</d:entry></d:dictionary> 

問題があり、要素のローカル名は、コロン記号が含まれている、と私は私のコードを実行し、それが行くとき、それは私に例外をスローしますWriteStartElement方法へと私にこのよう指示: ':辞書D' で

無効な名前の文字を。 ':'文字は16進値0x3Aで、名前に含めることはできません。

私はこの問題をどのように解決して、コロン記号を含むローカル名を書き込むべきですか?

+1

「d:」は名前空間を識別します。ここをクリックしてください:http://www.w3schools.com/xml/xml_namespaces.asp – Fruchtzwerg

答えて

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

     } 
    } 

} 
+0

あなたのプログラムの出力が正しくないかテストしました。 –

+0

あなたのものは:**

+0

さて、私は試しましたが、コードを変更しました。 '' d:index d:value = "辞書アプリケーション" /> –

1

要素ローカル名は、コロンの後の部分です(たとえば、dictionaryd:dictionary)。コロンの前の部分は名前空間接頭辞です。つまり、コロンで要素ローカル名を書きたくないということです。あなたは3つの文字列パラメータを受け入れる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)

関連する問題