2012-02-17 34 views
13

XMLで行うことはすべて、大文字と小文字が区別されます。大文字と小文字を区別しないXMLパーサC#

しかし、今私は何らかの形でxml名/属性の認識に大文字小文字を区別しないと、私が書いているソフトウェアでエラーが少なくなる状況にいると思います。大文字と小文字を区別しないXPathは送信される神です。

C#でこれを行う簡単な方法/ライブラリはありますか?

+0

しかし、あなたは 'XElement.Parse(xmlText.Tolower())'を実行することができます。 –

+0

XMlドキュメントは、それぞれ異なる名前の2つの*異なる*要素を持つことができます: 'MyName'と' myName'。それらを同じ名前に変換/処理することは、大きな結果をもたらす可能性があるエラーです。 –

答えて

14

を作成することができます:MyNamemyName - 異なることを意図しています。それらを同じ名前に変換/処理することは、大きな結果をもたらす可能性があるエラーです。

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:variable name="vUpper" select= 
"'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> 

<xsl:variable name="vLower" select= 
"'abcdefghijklmnopqrstuvwxyz'"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*[name()=local-name()]" priority="2"> 
    <xsl:element name="{translate(name(), $vUpper, $vLower)}" 
    namespace="{namespace-uri()}"> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="*" priority="1"> 
    <xsl:element name= 
    "{substring-before(name(), ':')}:{translate(local-name(), $vUpper, $vLower)}" 
    namespace="{namespace-uri()}"> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="@*[name()=local-name()]" priority="2"> 
    <xsl:attribute name="{translate(name(), $vUpper, $vLower)}" 
    namespace="{namespace-uri()}"> 
     <xsl:value-of select="."/> 
    </xsl:attribute> 
</xsl:template> 

<xsl:template match="@*" priority="1"> 
    <xsl:attribute name= 
    "{substring-before(name(), ':')}:{translate(local-name(), $vUpper, $vLower)}" 
    namespace="{namespace-uri()}"> 
    <xsl:value-of select="."/> 
    </xsl:attribute> 
</xsl:template> 
</xsl:stylesheet> 

:上記が当てはまらない場合に

は、次いで、ここでのみ、小文字の要素名と小文字の属性名を有するものに文書を処理するXSLTを使用して、より正確な解決策でありますこの変換は、この1例えば、任意のXML文書に適用されます。

<authors xmlns:user="myNamespace"> 
    <?ttt This is a PI ?> 
    <Author xmlns:user2="myNamespace2"> 
    <Name idd="VH">Victor Hugo</Name> 
    <user2:Name idd="VH">Victor Hugo</user2:Name> 
    <Nationality xmlns:user3="myNamespace3">French</Nationality> 
    </Author> 
    <!-- This is a very long comment the purpose is 
     to test the default stylesheet for long comments--> 
    <Author Period="classical"> 
    <Name>Sophocles</Name> 
    <Nationality>Greek</Nationality> 
    </Author> 
    <author> 
    <Name>Leo Tolstoy</Name> 
    <Nationality>Russian</Nationality> 
    </author> 
    <Author> 
    <Name>Alexander Pushkin</Name> 
    <Nationality>Russian</Nationality> 
    </Author> 
    <Author Period="classical"> 
    <Name>Plato</Name> 
    <Nationality>Greek</Nationality> 
    </Author> 
</authors> 

指名手配、正しい結果(要素や属性名C小文字にonverted)はが生成されます

<authors><?ttt This is a PI ?> 
    <author> 
     <name idd="VH">Victor Hugo</name> 
     <user2:name xmlns:user2="myNamespace2" idd="VH">Victor Hugo</user2:name> 
     <nationality>French</nationality> 
    </author><!-- This is a very long comment the purpose is 
     to test the default stylesheet for long comments--> 
    <author period="classical"> 
     <name>Sophocles</name> 
     <nationality>Greek</nationality> 
    </author> 
    <author> 
     <name>Leo Tolstoy</name> 
     <nationality>Russian</nationality> 
    </author> 
    <author> 
     <name>Alexander Pushkin</name> 
     <nationality>Russian</nationality> 
    </author> 
    <author period="classical"> 
     <name>Plato</name> 
     <nationality>Greek</nationality> 
    </author> 
</authors> 

文書は、ご希望の形式に変換されたら、あなたは変換された文書に任意の処理を実行することができます。

+0

はかなり見えます。 –

+0

@ArsenZahray:ようこそ。 –

7

XMLはテキストです。使用しているパーサーにロードする前にちょうどToLowerにしてください。

スキーマに対して検証する必要がなく、値がすべて小文字であることに気をつけない限り、これはうまくいくはずです。


事実は、任意のXMLパーサー大文字と小文字を区別になるということです。そうでなければ、XMLパーサではありません。

+8

しかし、おそらくあなたの値を 'ToLower'にしたくないでしょう。 – CaffGeek

+1

@Chad - おそらく。私は私の答えにその警告を入れました。 – Oded

+0

私はそれを考えました。ほとんどの場合、フィールドに情報が含まれている場合があることを除いて、これは機能しますが、ケースを保持する必要があります。たとえば、パスワード、ハッシュなどの外部世界のようなものです。一方、xhtmlのName属性とname属性を区別する必要はありません。 –

11

あなたは、XML文書がそれぞれという名前の2つの異なる要素持つことができ、大文字と小文字を区別しない方法(ユーザビリティの拡張子)、例えば:

public static class XDocumentExtensions 
{ 
    public static IEnumerable<XElement> ElementsCaseInsensitive(this XContainer source, 
     XName name) 
    { 
     return source.Elements() 
      .Where(e => e.Name.Namespace == name.Namespace 
       && e.Name.LocalName.Equals(name.LocalName, StringComparison.OrdinalIgnoreCase)); 
    } 
} 
0

まず、すべてのタグと属性名を小文字に変換し、値をそのままにして、SAXの解析を使用します。 XmlTextReaderとなります。

関連する問題