读书人

xml定义到某个节点的有关问题

发布时间: 2012-01-02 22:40:04 作者: rapoo

xml定义到某个节点的问题

XML code
<xs:element name="GetAllManufacturersVehicleReportDataSchema_v1.0.2363.26364" msdata:IsDataSet="true" msdata:Locale="en-AU" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:xs="http://www.w3.org/2001/XMLSchema">    <xs:complexType>        <xs:choice maxOccurs="unbounded">            <xs:element name="Table">                <xs:complexType>                    <xs:sequence>                        <xs:element name="Vehicle_ID" type="xs:int" minOccurs="0" />                        <xs:element name="Created_Date" type="xs:dateTime" minOccurs="0" />                        <xs:element name="Current_Model" type="xs:string" minOccurs="0" />                        <xs:element name="Make" type="xs:string" minOccurs="0" />                        <xs:element name="Marketing_Model" type="xs:string" minOccurs="0" />                        <xs:element name="Variant" type="xs:string" minOccurs="0" />                        <xs:element name="Model_Release_Year" type="xs:int" minOccurs="0" />                        <xs:element name="Transmission_Type" type="xs:string" minOccurs="0" />                        <xs:element name="Body_Style" type="xs:string" minOccurs="0" />                        <xs:element name="Fuel_Type" type="xs:string" minOccurs="0" />                        <xs:element name="Engine_Displacement" type="xs:string" minOccurs="0" />                        <xs:element name="Engine_Configuration" type="xs:string" minOccurs="0" />                        <xs:element name="Induction" type="xs:string" minOccurs="0" />                        <xs:element name="Fwd_Gears_No" type="xs:string" minOccurs="0" />                        <xs:element name="Side_Door_No" type="xs:string" minOccurs="0" />                        <xs:element name="Seating_Capacity" type="xs:string" minOccurs="0" />                        <xs:element name="Driving_Wheels_No" type="xs:string" minOccurs="0" />                        <xs:element name="Vehicle_Class" type="xs:string" minOccurs="0" />                        <xs:element name="CO2_Emissions" type="xs:int" minOccurs="0" />                        <xs:element name="Fuel_Consumption" type="xs:double" minOccurs="0" />                        <xs:element name="Air_Pollution_Rating" type="xs:string" minOccurs="0" />                        <xs:element name="Greenhouse_Rating" type="xs:string" minOccurs="0" />                        <xs:element name="GVG_Star_Rating" type="xs:string" minOccurs="0" />                    </xs:sequence>                </xs:complexType>            </xs:element>        </xs:choice>    </xs:complexType></xs:element>


我通过webservice得到这么一段xml。
用doc.SelectSingleNode("/element/complexType/choice/element/complexType/sequence")
这样定位到sequence节点,可返回的都是null,不知道该如何定位了,请高手帮忙了。Thanks

[解决办法]
up
------解决方案--------------------


//加载基础的xsd
XmlSchemaSet xsSet = new XmlSchemaSet();
XmlDocument xmlDoc = new XmlDocument();
ICollection schemas = null;
string path = Path.Combine(basexsdFilePath, "SWIFT Base Types.xsd");
xmlDoc.Load(path);
string baseXsdFiletargetNameSpace = xmlDoc.ChildNodes[1].Attributes["xmlns"].Value;
xsSet.Add(baseXsdFiletargetNameSpace, path);
schemas = xsSet.Schemas(baseXsdFiletargetNameSpace);
foreach (XmlSchema schema in schemas)
{
BaseSchema = schema;
}

path = Path.Combine(basexsdFilePath, "SWIFT Common Data Types.xsd");
xmlDoc.Load(path);
baseXsdFiletargetNameSpace = xmlDoc.ChildNodes[1].Attributes["xmlns"].Value;
xsSet.Add(baseXsdFiletargetNameSpace, path);
schemas = xsSet.Schemas(baseXsdFiletargetNameSpace);
foreach (XmlSchema schema in schemas)
{
CommonData = schema;
}

if (BaseSchema == null)
{
throw new Exception("请先加载基础schema!");
}
//加载基础的xsd
XmlSchemaSet xsSet = new XmlSchemaSet();
XmlDocument xmlDoc = new XmlDocument();
ICollection schemas = null;
xsSet.Add(BaseSchema);
xsSet.Add(CommonData);
//加载xsd
xmlDoc.Load(xsdFilePath);
string xsdFiletargetNameSpace = xmlDoc.ChildNodes[1].Attributes["xmlns"].Value;
xsSet.Add(xsdFiletargetNameSpace, xsdFilePath);
xsSet.Compile();
//得到报文类型名称
string messageType = Path.GetFileName(xsdFilePath);
messageType = messageType.Split('.')[0].Substring(2, 3);
schemas = xsSet.Schemas(xsdFiletargetNameSpace);

//循环所有的schema元素,直到有域节点的节点,则开始递归分析
int xOrder = 0;
PrimaryFieldExisted = false;
int maxOcrurs = 0;
foreach (XmlSchema schema in schemas)
{
foreach (XmlSchemaObject item in schema.Items)
{
if (item is XmlSchemaElement)
{
XmlSchemaElement curElement = item as XmlSchemaElement;
XmlSchemaComplexType schemaType = ((XmlSchemaElement)curElement).SchemaType as XmlSchemaComplexType;
if (schemaType != null)
{
XmlSchemaSequence sequence = schemaType.Particle as XmlSchemaSequence;

foreach (XmlSchemaObject sequenceItem in sequence.Items)
{
if (sequenceItem is XmlSchemaElement && ((XmlSchemaElement)sequenceItem).Name.StartsWith("SWIFT_CATEGORY",StringComparison.OrdinalIgnoreCase))
{
schemaType = ((XmlSchemaElement)sequenceItem).SchemaType as XmlSchemaComplexType;
if (schemaType != null)
{
sequence = schemaType.Particle as XmlSchemaSequence;

foreach (XmlSchemaObject sequenceItem1 in sequence.Items)
{
if (sequenceItem1 is XmlSchemaParticle)
{
maxOcrurs = 0;
ProcessFieldElement((XmlSchemaParticle)sequenceItem1, Convert.ToInt32(messageType), messageType, "", ref xOrder, ref maxOcrurs);


}
}
}
}
}
}
}
}
}
这是我以前写的读取schema 的代码,你可以参考下
[解决办法]
XmlNodeList^ xmlNodeL = xmlDoc->GetElementsByTagName("xs:sequence");
String^ strName = nullptr;
for each(XmlNode^ xn in xmlNodeL)
{
XmlNodeList^ xnl = xn->ChildNodes;
for each(XmlNode^ cxn in xnl)
{
XmlElement^ xmlEle = dynamic_cast<XmlElement^>(cxn);
if(xmlEle->Name == "xs:element")
{
if(xmlEle->HasAttribute("name"))
strName = xmlEle->GetAttribute("name");
}
}
}


拖管下的

读书人网 >asp.net

热点推荐