Как изменить внутренний текст из жестко закодированного XML-файла?
Привет,
Правка-перефразирование моего вопроса и изменение кода
Я хотел бы изменить некоторый внутренний текст из моих xml-файлов, жестко закодировав его. Но я натыкаюсь на сообщение об ошибке, в котором говорится, что в коде есть нечитаемые символы. Ошибка возникает в строке XmlDocument.
Я также попытался добавить XmlTextReader для чтения выбранного XML-файла, как я думал, после того, как он был показан в richTextbox, память больше не заполняется содержимым. Таким образом, кнопка btnMakeNegative обычно не знает, что сделать отрицательным. Поэтому нам нужно прочитать то, что находится в richtextbox. Но даже там я получаю сообщение об ошибке, что были найдены странные символы.
Важнейшая цель:
Нажмите кнопку 1, чтобы загрузить Xml-файл из каталога X, и выберите его из списка.
Покажите это в richTextBox
Нажмите на вторую кнопку, чтобы изменить внутренний текст на определенных узлах
нажмите на третью кнопку, чтобы сохранить изменения в определенном каталоге и дать ему исходное имя + "- NEG".
Заранее спасибо.
EDIT 2-нашел причину ошибки, но не знаю, как с ней справиться.
ok, I have found over which weird characters the code is stumbling but I can't fix it. Apparently, the xml file that I've opened with my button_click is read as a kind of HTML instead of an xml file. After initiating the XmlReader the reader can't figure out the backslashes and the backslashes+n in the file. when reading it it looks like this: Hide Copy Code "<?xml version=\"1.0\"?>\n<PrepaymentGridfeeDataByServiceDeliveryPoint xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"un:unece:260:data:EEM:02-02-PrepaymentGridfeeDataByServiceDeliveryPoint\">\n <HeaderBEEnergyDocument>\n <Identification>45071dc8-558d-439a-8f0a-88ae73a74910</Identification>\n <DocumentType listAgencyIdentifier=\"6\">386</DocumentType>\n <Creation>2016-06-14T12:31:58.0+01:00</Creation>\n <SenderBEEnergyParty>\n <Identification schemeAgencyIdentifier=\"9\">5414488009809</Identification>\n </SenderBEEnergyParty>\n <RecipientBEEnergyParty>\n <Identification schemeAgencyIdentifier=\"9\">0000000000000</Identification> \n </RecipientBEEnergyParty>\n <IssuerBEEnergyParty>\n <Identification schemeAgencyIdentifier=\"9\">5414488009809</Identification>\n </ Notice the backslashes? They should be in the opposite way for an xml. And why the hell are there spaces in this file? Really weird! So a solution would be that when I open openFileDialog1 I find a way to make him read the text in XML and not in PlainText. Is there a way to do this? Or should I need to give up the openFileDialog toolbox for this issue? what to use instead then?
Что я уже пробовал:
Xml-файл выглядит следующим образом (он частичный, но узлы одинаковы во всем документе: root-parentnode -childnode (- subchildnode) с атрибутами или без них:
<?xml version="1.0"?> <AnXMLTestFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="un:unece:260:data:EEM:AnXMLTestFile"> <HeaderBEDocument> <Identification>45071dc8-558d-439a-8f0a-88ae73a74910</Identification> <DocumentType listAgencyIdentifier="6">386</DocumentType> <Creation>2016-06-14T12:31:58.0+01:00</Creation> <SenderBEParty> <Identification schemeAgencyIdentifier="9">1234567890123</Identification> </SenderBEParty> <RecipientBEParty> <Identification schemeAgencyIdentifier="9">1234567890123</Identification> </RecipientBEParty> <IssuerBEParty> <Identification schemeAgencyIdentifier="9">1234567890123</Identification> </IssuerBEParty> <AddresseeBEParty> <Identification schemeAgencyIdentifier="9">1234567890123</Identification> </AddresseeBEParty> <DocumentStructureRevision>02-02.001</DocumentStructureRevision> </HeaderBEDocument> </AnXMLTestFile>
Код есть как таковой:
public partial class frmEditXML : Form { //get files from directory string[] path = Directory.GetFiles(@"C:\Users\decraiec\Documents\A_Automated", "*.XML"); public frmEditXML() { InitializeComponent(); } private void btnSelectFile_Click(object sender, EventArgs e) { openFileDialog1.Filter = "xml files|*.xml|All files|*.*"; if (openFileDialog1.ShowDialog() == DialogResult.OK) { try { richTextBox1.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.PlainText); } catch (Exception exc) { MessageBox.Show("An error occured: " + System.Environment.NewLine + exc.ToString() + System.Environment.NewLine); throw; } } } private void btnMakeNegative_Click(object sender, EventArgs e) { <pre> //Read selected file. For this create a reader. string _input = richTextBox1.Text; // You can pre-check the entire text by checking each character. // Though not totally efficient it does work. List<string> invalidChars = new List<string>(); // You can change the loop to be able to replace the invalid characters if you like. This is an exampled to see what characters are bad. foreach (char ch in _input) { if (!XmlConvert.IsXmlChar(ch)) { invalidChars.Add(ch.ToString()); } } XmlReaderSettings settings = new XmlReaderSettings(); settings.IgnoreWhitespace = true; XmlTextReader reader = new XmlTextReader(_input); /*always error message*/ XmlDocument doc = new XmlDocument(); doc.Load(_input); XmlNodeList nodeList = doc.DocumentElement.SelectNodes("/AnXMLTestFile/"); //find the node to change the content //if node is not present, do nothing foreach (XmlNode xNode in doc) { if (xNode.ParentNode.Attributes["HeaderBEDocument"].Value != "") { doc.SelectSingleNode("Identification").InnerText = "string"; doc.SelectSingleNode("SCI").InnerText = "string"; doc.SelectSingleNode("ReferenceType").InnerText = "string"; doc.SelectSingleNode("CCType").InnerText = "AA"; } else { } //do nothing } } private void btnSavechanges_Click(object sender, EventArgs e) { if (saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) { File.WriteAllText(saveFileDialog1.FileName, richTextBox1.Text); } }
Richard Deeming
Репост
Вы уже опубликовали этот вопрос:
https://www.codeproject.com/Questions/1170972/An-unhandled-exception-of-type-system-argumentexce[^]
Karthik_Mahalingam
Не перепечатывайте, вместо этого вы должны обновить существующий вопрос с помощью Улучшить вопрос
AAB40
вот что я здесь сделал! Именно по поручению Ричарда я хотел закрыть этот вопрос и начать все сначала.
Ramza360
Ваши изменения не отражают того, что я опубликовал в своем решении. Вы создаете экземпляр XmlTextReader, но никогда не используете его, просто используйте LoadXml XmlDocument после удаления недопустимых символов.