2011-01-31 8 views
3

私は、WSDL文書、以下に示したの抽出物を持っている...最も近い祖先のXS:XSのドキュメントノード:要素

<xs:complexType name="CustomerNameType"> 
    <xs:annotation> 
    <xs:documentation>Structure for customer name</xs:documentation> 
    </xs:annotation> 
    <xs:sequence> 
    <xs:element name="FullName" minOccurs="0"> 
     <xs:simpleType> 
     <xs:restriction base="xs:string"> 
      <xs:maxLength value="60"/> 
     </xs:restriction> 
     </xs:simpleType> 
    </xs:element> 
    <xs:element name="Forenames" minOccurs="0"> 
     <xs:simpleType> 
     <xs:restriction base="xs:string"> 
      <xs:maxLength value="60"/> 
     </xs:restriction> 
     </xs:simpleType> 
    </xs:element> 
    </xs:sequence> 
</xs:complexType> 

私は、xs知っている:要素/ @名前を、私は希望最も近いxs:documentation要素を取得します。上記の例を使用して

、私は、xsことを知っている:ドキュメントノード:要素/ @名=「フルネーム」、と私は最寄りのXSからテキスト「顧客名の体制」を取得したいと思います!

私は私がstackoverflowの(および他のサイト)で発見したいくつかの例を変更しようとしているが、それらのどれも動作しません。典型的:0)。

乾杯。

みんなに答えるためのおかげで...うまくいけば、これは便利で来る...

public static string DecryptStupidCapsError(string sOriginalErrorMessage) 
{ 
    string sProblem = sOriginalErrorMessage.Substring(sOriginalErrorMessage.IndexOf("---> System.Xml.Schema.XmlSchemaException: ") + "---> System.Xml.Schema.XmlSchemaException: ".Length); 
    sProblem = sProblem.Substring(0, sProblem.IndexOf("An error occurred")); 

    string sElementName = sProblem.Substring(sProblem.IndexOf(":") + 1); 
    sElementName = sElementName.Substring(sElementName.IndexOf(":") + 1); 
    sElementName = sElementName.Substring(0, sElementName.IndexOf("'")); 

    XmlDocument xd = new XmlDocument(); 
    xd.LoadXml(Properties.Resources.ServiceRequest_Service_74b1); 

    XmlNamespaceManager xnsm = new XmlNamespaceManager(xd.NameTable); 
    XPathDocument x = new XPathDocument(new StringReader(Properties.Resources.ServiceRequest_Service_74b1)); 
    XPathNavigator foo = x.CreateNavigator(); 
    foo.MoveToFollowing(XPathNodeType.Element); 
    IDictionary<string, string> whatever = foo.GetNamespacesInScope(XmlNamespaceScope.All); 

    foreach (KeyValuePair<string, string> xns in whatever) 
    { 
     xnsm.AddNamespace(xns.Key, xns.Value); 
    } 

    XmlNodeList xnl = xd.SelectNodes("//xs:element[@name='" + sElementName + "']", xnsm); 

    StringBuilder sb = new StringBuilder(); 

    sb.AppendLine("CAPS has reported a (cryptic) error whilst validating the data you entered."); 
    sb.AppendLine(); 
    sb.AppendLine("The following summary should enable you to determine what has caused the '" + sElementName + "' data to be invalid."); 
    sb.AppendLine("----------"); 

    string sLast = string.Empty; 
    foreach (XmlElement xe in xnl) 
    { 
     StringBuilder sbLast = new StringBuilder(); 
     XmlElement xeDocumentation = (XmlElement)xe.OwnerDocument.SelectSingleNode("(//xs:element[@name='" + sElementName + "']/ancestor-or-self::*/xs:annotation/xs:documentation)[last()]", xnsm); 
     if (xeDocumentation.InnerText == sLast) continue; 

     sbLast.AppendLine(sElementName + " AKA " + xeDocumentation.InnerText + ": "); 
     sbLast.AppendLine("has the following validation rules:"); 
     XDocument xdoc = XDocument.Parse(xe.OuterXml); 
     sbLast.AppendLine(xdoc.ToString()); 
     sbLast.AppendLine("----------"); 

     sb.AppendLine(sbLast.ToString()); 
     sLast = xeDocumentation.InnerText; 
    } 


    return sb.ToString(); 
} 

は基本的には、sOriginalErrorMessageは)(XmlSchemaException.ToStringを=、およびProperties.Resources.ServiceRequest_Service_74b1はそのデータのwsdlですが検証されました。この関数は(つまり、正規表現を欠いている!)古いXmlSchemaExceptionとは反対に、検証の失敗を。引き起こしたものにとしてユーザにはるかに優れた手がかりを与えます。

もう一度おねがいします。 "FullName"に等しい@name

+0

フルネーム要素に指を入れて上に移動します。。しかし真剣に言えば、XPATH、XSLT、Javaなどでそれを手に入れたいと言っているのですか? –

+0

申し訳ありませんが、私はC#でXPathを意味しました。私は以前に返答していただろうが、私は手をプリンタに詰め込んだ。 – user597118

答えて

2

次のXPathは、指定された要素のドキュメントとすべての親のドキュメントを返します。私はAlejandroの答えは、別のスキーマであなたにあまり関心のない兄弟のドキュメントを返すかもしれないと思う。

(//xs:element[@name='orderRequest'] 
    /ancestor-or-self::* 
     /xs:annotation 
      /xs:documentation)[last()] 
+0

+1良い答えですが、位置述語がありません。今追加されました。 –

+0

&Alejandro、素晴らしい、ありがとう...それは治療を働く! – user597118

+0

@Alejandro、編集に感謝します。私は前に "last()"部分を使ったことはありません。 –

5

xs:element要素はxs:documentation祖先要素をしていないが、いずれかを先行します。

だから、あなたが使用できます。

//xs:element[@name='FullName']/preceding::xs:documentation[1] 

を:私はあなたが行きたいの深スキーマに知られていないので、私は開始//演算子を使用していました。

+0

+1。すべて正しい。 – Flack

+0

@Alejandroのおかげで - 素敵なアプローチが、いくつかのxs:要素のは、xs持っている:ドキュメントの子要素を...とき先行XS、それが失敗した例:ドキュメントノード:要素は、xsを持っています。私は間違いなく、ある時点で祖先を使う必要があります。再度、感謝します。良い答えは – user597118

+0

+1です。 –

関連する問題