#c# #visual-studio-2005 #xmlreader
#c# #visual-studio-2005 #xmlreader
Вопрос:
редактировать: Проект является старым проектом, и приведенный ниже код представляет собой один класс, который обрабатывает xml.
Возникает вопрос, как получить xsd из старого устаревшего приложения, но, похоже, все, что оно делает, это: XmlReader.parseXML(fileName,outputFile); в методе ProcessXml().
using System;
using System.IO;
using System.Configuration;
using Utilities;
namespace JobProcessor
{
public class XmlJob : Job
{
#region variables
private string ftpServer;
private string ftpUserName;
private string ftpPassWord;
private string ftpDestination;
///<summary>The xml reader used to get validation information from the xmp parsing</summary>
protected XmlReader xmlReader = new XmlReader();
private string outputFile;
public XmlJob(string fileName, string type) : base(fileName, type){
ftpServer = ConfigurationManager.AppSettings[type "-ftp"];
ftpUserName = ConfigurationManager.AppSettings[type "-ftpUser"];
ftpPassWord = ConfigurationManager.AppSettings[type "-ftpPass"];
ftpDestination = ConfigurationManager.AppSettings[type "-ftpDest"];
}
protected bool ConfigureXmlReader(){
int recType = 0;
try{
//set up the record types (i.e. the elements that trigger a new record in the output
while(ConfigurationManager.AppSettings[type "-RecordType" recType.ToString("00")] != null){
xmlReader.AddRecordType(ConfigurationManager.AppSettings[type "-RecordType" recType.ToString("00")],recType.ToString("00"));
recType ;
}
//store the number of types
xmlReader.SetNoRecordTypes(recType);
}catch(Exception e){
HandleError("Error loading record typesrn" e.ToString() "rn" e.StackTrace "rn");
return(false);
}
try{
//set up the fields which make up each record type
for(int i=0;i<recType;i ){
xmlReader.AddFieldsList(i,ConfigurationManager.AppSettings[type "-" i.ToString("00") "Fields"]);
}
}catch(Exception e){
HandleError("Error loading field listrn" e.ToString() "rn" e.StackTrace "rn");
return(false);
}
return(true);
}
public override void RunJob(){
outputFile = Path.Combine(destinationDirectory, Path.GetFileNameWithoutExtension(fileName) ".flat");
if(!ConfigureXmlReader()){
return;
}
if(!CheckInputFile()){
return;
}
if(!ProcessXml()){
return;
}
if(!Validate()){
return;
}
if(ftpServer!=null amp;amp; ftpUserName!=null amp;amp; ftpPassWord!=null amp;amp; ftpDestination!=null){
if(!FtpFile()){
return;
}
}
MoveOriginalFile();
}
protected virtual bool Validate(){
return(true);
}
protected bool ProcessXml(){
/*
* Process the xml file into a delimited format
*/
try{
xmlReader.ParseXml(fileName,outputFile);
}catch(Exception e){
HandleError("Error parsing XML filern" e.ToString() "rn" e.StackTrace "rn");
return(false);
}
return(true);
}
protected bool FtpFile(){
try{
FtpMethods.UploadFile(ftpServer,ftpUserName,ftpPassWord,outputFile,ftpDestination);
}catch(Exception e){
HandleError("Error FTPing filern" e.ToString() "rn" e.StackTrace "rn");
return(false);
}
return(true);
}
#endregion
}
}
Что именно делает эта команда? F1 ничего не находит, и поиск в Google приводит меня к множеству xmlTextReaders.
Комментарии:
1. Каков тип экземпляра XmlReader здесь?
2. Показанный вами код не компилируется.
XmlReader
является абстрактным классом.3. Опубликуйте свой реальный код,
XmlReader
он абстрактен и не может быть создан.4. System.Xml.XmlReader является абстрактным, поэтому вы, должно быть, используете другой тип с тем же именем. Пожалуйста, не могли бы вы дать нам полное имя (т. Е. с пространствами имен) используемого вами XmlReader?
5.
XmlReader
вероятно, это не то,System.Xml.XmlReader
что есть в .NET Framework. Проверьте, откуда это берется. Наугад предположу, что он принимает имя файла, открывает файл и преобразует содержимое в XML и, наконец, записывает результат XML в outputFile.
Ответ №1:
Похоже, что XMLReader
тип здесь взят из библиотеки утилит, а не из XMLReader
типа .NET.
Ответ №2:
Редактировать: После просмотра кода кажется, что XmlReader является пользовательским классом (учитывая, что никаких инструкций using для System.Xml существует), который, скорее всего, обтекает XDocument, как объяснено ниже
Возможно, у него неправильное имя, единственный известный мне метод синтаксического анализа, который работает с Xml, — это все XmlElements в пространстве имен System.Xml.Linq. Т.е.
XDocument.Parse(xmlString);
Это проанализирует xml, проверит, является ли это допустимым XML-документом, и, если это так, загрузит его как XDocument (или любой другой элемент)
Ответ №3:
XmlReader
Класс, который вы используете, является пользовательским классом, скорее всего, так оно и есть Utilities.XmlReader
. Мы ничего не можем сказать об этом, потому что это класс, написанный вами или коллегой.
Ответ №4:
Я бы предположил, что parseXML был методом расширения XmlReader, если справка MSDN / F1 не дает никакой информации об определении метода? Или, возможно, автор кода сделал подкласс из XmlReader и добавил этот метод.
Ответ №5:
У XmlReader
класса нет Parse
метода. Проверьте, каков тип времени выполнения xmlReader
переменной, объявленной в вашем коде, а затем перепроверьте msdn.
Или же вы имели в виду XDocument.Parse
.
Обновить после редактирования OP
мне не удалось найти ни одного ParseXml
во всем BCL.
Update2 после редактирования OP
XmlReader
Класс является абстрактным и, следовательно, не может использоваться так, как объявлено в вашем коде.
Мы должны заключить (также потому, что System.Xml
пространство имен не было импортировано в ваш файл …), что тип xmlReader
переменной в вашем коде, вероятно, объявлен где-то в Utilities
пространстве имен, никто не может догадаться, как вы (или кто-либо другой) его закодировали.
В качестве дополнительного примечания, при использовании XmlReader
или любого другого типа, реализующего IDisposable
интерфейс, вы должны позаботиться о его удалении (просмотреть ссылку).