2012-01-27 10 views
3

私はXHTMLファイルを持っている:のXmlDocument無視のxmlns

<html xmlns="http://www.w3.org/1999/xhtml"> 

私はそれをロードします。

XmlDocument xml = new XmlDocument(); 
StringReader sr = new StringReader(html); 
XmlTextReader xmltr = new XmlTextReader(sr); 
xmltr.Namespaces = false; 
xml.Load(xmltr); 

を私はいつもThe 'xmlns' attribute is bound to the reserved namespace 'http://www.w3.org/2000/xmlns/'.例外だxml.InnerXmlを呼び出し、内部XMLにアクセスすることができない場合には、私のXmlDocument。どのようにロード中にxmlnsを取り除く?

ソリューションです:推測で

XmlNode xmln = xml.SelectSingleNode("//html"); 
if (xmln != null) 
    ((XmlElement)xmln).RemoveAttribute("xmlns"); 
+0

あなたのXHTML宣言は 'http:// www.w3.org/1999/xhtml'について語っていますが、ここで説明したエラーは' http://www.w3.org/2000/xmlns'彼らはどちらも正しいのですか? –

+0

はい、私のサードパーティのXHTMLは1999年で例外は2000と言います。 – Denis

+0

もっと重要なビットは "xhtml"と "xmlns"のビットです... –

答えて

2

、あなたが解析しようとしているページは最近ので、名前空間、XHTMLに変わりましたか?

@JonSkeetあたりとして、あなたはあなたのXmlTextReader

することはできいずれか

  • 抱擁名前空間にxmltr.Namespaces = false;を設定し、XHTML(xmlns="http://www.w3.org/1999/xhtml")名前空間を管理するためにXmlNameSpaceManagerを使用しないでください。名前空間を無視する
  • 使用の名前空間などlocal-name()などにとらわれないxpath、:*

xml.SelectSingleNode("/*[local-name()='html']/*[local-name()='body']") 

いずれかの方法であなたがハックしない限り、あなたのコードは、名前空間に適応するために変更する必要があります。ロードする前にXMLから名前空間を削除します。

*local-name()で//を使用することもできますが、要素数の多いドキュメントには注意が必要です。これは非常に遅くなる可能性があります。

+1

ありがとうございます。私はすでに '((XmlElement)xmln).RemoveAttribute(" xmlns ");を使って名前空間属性を取り除いています。 – Denis