私は、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
と
フルネーム要素に指を入れて上に移動します。。しかし真剣に言えば、XPATH、XSLT、Javaなどでそれを手に入れたいと言っているのですか? –
申し訳ありませんが、私はC#でXPathを意味しました。私は以前に返答していただろうが、私は手をプリンタに詰め込んだ。 – user597118