У меня в памяти есть очень правильная строка XML, загруженная из веб-службы жалоб OGC.
Когда я использую следующий код для создания am XmlTextReader для синтаксического анализа в моем синтаксическом анализаторе,
using (var sr = new StringReader(schemaString))
{
using (var reader = new XmlTextReader(sr))
{
try
{
schema = new GML2Parser().GetClassDefinition(reader, schema);
}
catch (Exception ex)
{
error = ex.Message;
}
}
}
Я получаю исключение, указывающее, что данные на уровне роола недействительны. Если я сохраню эту строку в локальный файл, например, feature_desc.xsd, использую File.ReadAllText и вызову вышеупомянутую процедуру, я столкнусь с аналогичной проблемой.
Однако если я использую XmlReader.Create(feature_desc.xsd), мой синтаксический анализатор не выдает исключение, когда он начинает обход узлов XML. Это метод, который суммирует эти действия;
private void ParseFeatureDescription(DataTableInfo schema, string featureDescription, string featureFileName, string featureName)
{
var schemaLocation = string.Empty;
if (featureFileName != null)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(featureDescription);
schemaLocation = infrut.Utilities.CreateTempFilePath(featureFileName, FileExtension.xsd, false);
doc.Save(schemaLocation);
}
var error = DeserializeTableSchema(schema, featureDescription, featureName);
if (!string.IsNullOrEmpty(error))
{
var fromFileFeatureDesc = File.ReadAllText(schemaLocation);
if (featureDescription == fromFileFeatureDesc){}
error = DeserializeTableSchema(schema, fromFileFeatureDesc, featureName);
if (!string.IsNullOrEmpty(error))
{
// last resort
var reader = XmlReader.Create(schemaLocation);
schema = new GML2Parser().GetClassDefinition(reader, schema);
if (schema.Columns.Count == 0)
{
// trouble
ActionResponse.LogError("Error parsing description of " + featureName + ". Inner exception is \r\n" + error
+ " " + " for content \r\n" + fromFileFeatureDesc, "WFS Worker");
}
}
}
}
В памяти представление строки:
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:ems=\"http://www.emssatcom.com\" xmlns:gml=\"http://www.opengis.net/gml\" elementFormDefault=\"qualified\" targetNamespace=\"http://www.emssatcom.com\">\r\n <xsd:import namespace=\"http://www.opengis.net/gml\" schemaLocation=\"http://10.25.131.62:8091/geoserver/schemas/gml/2.1.2/feature.xsd\" />\r\n <xsd:complexType name=\"asmcc_srr_viewType\">\r\n <xsd:complexContent>\r\n <xsd:extension base=\"gml:AbstractFeatureType\">\r\n <xsd:sequence>\r\n <xsd:element maxOccurs=\"1\" minOccurs=\"0\" name=\"gid\" nillable=\"true\" type=\"xsd:int\" />\r\n <xsd:element maxOccurs=\"1\" minOccurs=\"0\" name=\"srr_name\" nillable=\"true\" type=\"xsd:string\" />\r\n <xsd:element maxOccurs=\"1\" minOccurs=\"0\" name=\"the_geom\" nillable=\"true\" type=\"gml:PolygonPropertyType\" />\r\n </xsd:sequence>\r\n </xsd:extension>\r\n </xsd:complexContent>\r\n </xsd:complexType>\r\n <xsd:element name=\"asmcc_srr_view\" substitutionGroup=\"gml:_Feature\" type=\"ems:asmcc_srr_viewType\" />\r\n</xsd:schema>"
и сохраненный файл:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ems="http://www.emssatcom.com" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" targetNamespace="http://www.emssatcom.com">
<xsd:import namespace="http://www.opengis.net/gml" schemaLocation="http://10.25.131.62:8091/geoserver/schemas/gml/2.1.2/feature.xsd" />
<xsd:complexType name="asmcc_srr_viewType">
<xsd:complexContent>
<xsd:extension base="gml:AbstractFeatureType">
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="0" name="gid" nillable="true" type="xsd:int" />
<xsd:element maxOccurs="1" minOccurs="0" name="srr_name" nillable="true" type="xsd:string" />
<xsd:element maxOccurs="1" minOccurs="0" name="the_geom" nillable="true" type="gml:PolygonPropertyType" />
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:element name="asmcc_srr_view" substitutionGroup="gml:_Feature" type="ems:asmcc_srr_viewType" />
</xsd:schema>
Кто-нибудь сталкивался с этим?
new XmlTextReader()
илиnew XmlTextWriter()
. Они устарели, начиная с .NET 2.0. Вместо этого используйтеXmlReader.Create()
илиXmlWriter.Create()
. - person John Saunders   schedule 31.01.2014ex.Message
, если хотите знать, что происходит. Всегда используйтеex.ToString()
, который покажет вам все. - person John Saunders   schedule 31.01.2014