2016-04-20 22 views
-1

UPDATEを含めます。このファイルには、html文書で検索および置換するための条件のリストが含まれています。問題は、&nbspのような文字列を検索する必要があることです。私は自分のコードがデコードされたアイテムを読むのではなく、テキストそのものを読みたいと思っています。は、要素内のXML CDATA

XMLに慣れていないことを認めて、要件を満たすいくつかの試みを行いました。私はCDATAATTRIBUTESに関するStackoverflowのリンクを読み込んでいますが、ここ(および他の箇所)の例は複数ではなくxmlファイルに1行の作成に集中しているようです。

<?xml version="1.0" encoding="utf-8" ?> 
<!DOCTYPE item [ 
    <!ELEMENT item (id, replacewith)> 
    <!ELEMENT id (#CDATA)> 
    <!ELEMENT replacewith (#CDATA)> 
    ]> 
]> 
<item id=" " replacewith="&nbsp;">Non breaking space</item> 
<item id="&#8209;" replacewith="-">Non breaking hyphen</item> 

この文書は含めて、私のエラーの数を与える:ここで

は、私が無駄に行われてきた多くの試みの一つであるDOCTYPEで

  • 、私が手<!ELEMENT id (#CDATA)>のようなエラー。 CDATA領域では、Visual Studioは '、'または '|'を期待していることを通知します。
  • ]>は私にinvalid token at the root of the documentのエラーを与えます。
  • もちろん、2番目の<itemの入力後に、XML document cannot contain multiple root level elementsというエラーが表示されます。

どのように私はむしろ解釈文字より、私は要素内のテキストを格納および取得することを可能にする複数の項目を含んでxmlファイルを書き込むことができますか?

私に役立つなら、私は.Net、C#、およびVisual Studioを使用しています。

編集: このXMLファイルの目的は、HTMLファイルで検索して置き換えるもののリストを自分のコードに提供することです。 xmlファイルには、単にwhat to search forwhat to replace withのリストが含まれています。ここで

は私が今の場所に持っているファイルである:それは何であるため、

最初の使い方
<?xml version="1.0" encoding="utf-8" ?> 
<Items> 
    <item id="&#8209;" replacewith="-">Non breaking hyphen</item> 
    <item id=" " replacewith="&nbsp;">Non breaking hyphen</item> 
</Items> 

は一例として、私はテキスト&#8209を読みたいではなく、私はこれを読んだとき、私は-を取得しますコードが表します。

助けてくれれば助けてください。

+0

あなたが達成しようとしていることが不明です。参照したい* valid * XMLのサンプルが役に立ちます。文字列の操作/ regexを使ってXMLを読み書きしようとしているなら、それをやめてください(少なくともそれについては尋ねないでください)。 –

+0

私は詳細とxmlファイルを使用して説明を更新しました。基本的には、検索してhtmlファイルに置き換えたい文字列のリストをコンパイルしようとしています。これらの文字列はユーザ​​ーが設定することができるので、xml設定ファイルに格納すると考えました。基本的には、デコードされた文字列ではなく生の文字列として属性内に含まれるテキストを読みたいと思っています。 – Bill

+0

テキストが必要な場合は、それをエンコードします。たとえば、NBSPは「& nbsp;」となります。 –

答えて

1

私のコメントで詳しく述べると、XMLは予約された文字のためHTMLのように機能します。アンパサンドは、任意のタイプのパーサー(ブラウザ、XMLリーダーなど)で読み込まれたときにリテラル文字列に変換するキーワードまたは文字コードの接頭辞です。

値をエスケープして、必要なリテラルとして読み込まれることを確認する最も簡単な方法は、Web用にエンコードしているかのように入力することです。たとえば、XMLドキュメントを作成するために、私はこれをしなかった:私はあなたが期待しているものとあなたのid値に入れ

 XmlDocument xmlDoc = new XmlDocument(); 
    XmlElement xmlItem; 
    XmlAttribute xmlAttr; 
    XmlText xmlText; 

    // Declaration 
    XmlDeclaration xmlDec = xmlDoc.CreateXmlDeclaration("1.0", "UTF-8", null); 
    XmlElement xmlRoot = xmlDoc.DocumentElement; 
    xmlDoc.InsertBefore(xmlDec, xmlRoot); 

    // Items 
    XmlElement xmlItems = xmlDoc.CreateElement(string.Empty, "Items", string.Empty); 
    xmlDoc.AppendChild(xmlItems); 

    // Item #1 
    xmlItem = xmlDoc.CreateElement(string.Empty, "item", string.Empty); 
    xmlAttr = xmlDoc.CreateAttribute(string.Empty, "id", string.Empty); 
    xmlAttr.Value = "&#8209;"; 
    xmlItem.Attributes.Append(xmlAttr); 
    xmlAttr = xmlDoc.CreateAttribute(string.Empty, "replacewith", string.Empty); 
    xmlAttr.Value = "-"; 
    xmlItem.Attributes.Append(xmlAttr); 
    xmlText = xmlDoc.CreateTextNode("Non breaking hyphen"); 
    xmlItem.AppendChild(xmlText); 

    xmlItems.AppendChild(xmlItem); 

    // Item #2 
    xmlItem = xmlDoc.CreateElement(string.Empty, "item", string.Empty); 
    xmlAttr = xmlDoc.CreateAttribute(string.Empty, "id", string.Empty); 
    xmlAttr.Value = " "; 
    xmlItem.Attributes.Append(xmlAttr); 
    xmlAttr = xmlDoc.CreateAttribute(string.Empty, "replacewith", string.Empty); 
    xmlAttr.Value = "&nbsp;"; 
    xmlItem.Attributes.Append(xmlAttr); 
    xmlText = xmlDoc.CreateTextNode("Non breaking hyphen"); 
    xmlItem.AppendChild(xmlText); 

    xmlItems.AppendChild(xmlItem); 

    // For formatting 
    StringBuilder xmlBuilder = new StringBuilder(); 
    XmlWriterSettings xmlSettings = new XmlWriterSettings 
    { 
     Indent = true, 
     IndentChars = " ", 
     NewLineChars = "\r\n", 
     NewLineHandling = NewLineHandling.Replace 
    }; 
    using (XmlWriter writer = XmlWriter.Create(xmlBuilder, xmlSettings)) 
    { 
     xmlDoc.Save(writer); 
    } 

    xmlOutput.Text = xmlBuilder.ToString(); 

注意してください。さて、それはエンコード取得する方法を見て:

<?xml version="1.0" encoding="utf-16"?> 
<Items> 
    <item id="&amp;#8209;" replacewith="-">Non breaking hyphen</item> 
    <item id=" " replacewith="&amp;nbsp;">Non breaking hyphen</item> 
</Items> 

あなたとこの1間の唯一の違いは、アンパサンドが&amp;としてエンコードされ、残りは文字列リテラルとして残っていることです。これはXMLの通常の動作です。それを再び読むと、それは文字通り&#8209;&nbsp;のように戻ってくるでしょう。

+0

この方法は、 '<'のような他の予約文字に対しても行われます。 '<'に変更し、 '>'を '>'(またはその逆)に変更します。より多くのエンティティの楽しみのために、これをチェックしてください:https://dev.w3.org/html5/html-author/charref –

+0

こんにちはクリス。これを提供していただきありがとうございます。私は今日テストします。主な違いは、シンプルなXML文書を作成して情報を格納する方法を考案したのに対し、XMLにテキストをリテラル文字列として扱うように強制しようとしていたことです。この時点で、私はどんな解決策にでもオープンしています:-) – Bill

+0

XML文書を生成すると、自動的に正しくエンコードすることを示していました。手動で行う場合は、「&#8209;」のように手動でエンコードする必要があります。基本的に、各属性のアンパサンドの最初のインスタンスを '&' –

関連する問題