Лучший способ изменить значение элемента в C#

В версии Eclipse, которую я использую (выпуск 1 службы Indigo), опция «Переименовать» не подходит для пакета по умолчанию (в отличие от других пакетов), но если вы выберете все классы, щелкните правой кнопкой мыши и выберите «Переместить», что позволит вам поместить их в новый пакет.

(Насколько я могу судить, опция «Переименовать» предназначена для переименования классов без , изменяющих их пакет, но Move конечно работает для перемещения между пакетами .)

Скриншоты процесса:

Исходная ситуация

Before [/g3]

Выберите все классы и покажите часть Refactor контекстного меню

enter image description here [/g4]

Выберите «Переместить», нажмите «Создать» Пакет и введите имя (mypackage в этом случае)

Move dialog [/g5]

Конечный результат

After [/g6]

Кроме того, если вы хотите переместить их в существующий пакет, вы можете просто перетащить классы.

Для тех, кто предлагает Refactor -> Rename на пакете, вот скриншоты t показывает, что не работает на моей машине:

No Rename option [/g7]

14
задан Spence 13 February 2009 в 01:06
поделиться

5 ответов

Вы могли использовать Систему. Xml. Пространство имен Linq наполняет для самого легкого для чтения кода. Это загрузит полный файл в память.

XDocument xdoc = XDocument.Load("file.xml");
var element = xdoc.Elements("MyXmlElement").Single();
element.Value = "foo";
xdoc.Save("file.xml");
33
ответ дан 1 December 2019 в 06:24
поделиться

РЕДАКТИРОВАНИЕ: не видел Ваш пункт о XmlDocument. XmlReader делает просто это. Вы не можете отредактировать XML-файлы с этим классом.

Вы хотите XmlWriter. Однако в случае, если это все еще полезно, вот код для XmlDocument.

private void changeXMLVal(string element, string value)
{
    try
    {
        string fileLoc = "PATH_TO_XML_FILE";
        XmlDocument doc = new XmlDocument();
        doc.Load(fileLoc);
        XmlNode node = doc.SelectSingleNode("/MyXmlType/" + element);
        if (node != null)
        {
            node.InnerText = value;
        }
        else
        {
            XmlNode root = doc.DocumentElement;
            XmlElement elem;
            elem = doc.CreateElement(element);
            elem.InnerText = value;
            root.AppendChild(elem);
        }
        doc.Save(fileLoc);
        doc = null;
    }
    catch (Exception)
    {
        /*
         * Possible Exceptions:
         *  System.ArgumentException
         *  System.ArgumentNullException
         *  System.InvalidOperationException
         *  System.IO.DirectoryNotFoundException
         *  System.IO.FileNotFoundException
         *  System.IO.IOException
         *  System.IO.PathTooLongException
         *  System.NotSupportedException
         *  System.Security.SecurityException
         *  System.UnauthorizedAccessException
         *  System.UriFormatException
         *  System.Xml.XmlException
         *  System.Xml.XPath.XPathException
        */
    }
}
5
ответ дан 1 December 2019 в 06:24
поделиться

Вы могли использовать XmlReader для чтения в класс, который откачивает данные назад через XmlWriter и сканирование для элемента между чтением-записью, изменяя значение по мере необходимости.

Честно, я немного удивлен, что Ваш XML-файл так огромен, Вы волнуетесь по поводу потребления памяти... не высказывание, что это никогда не проблема. Без большего количества информации я не могу сказать, что Ваш гипотетический XML-файл не составляет 50 ГБ, но во многих случаях загружающиеся файлы, которые кажутся большими в память достаточно долго для управления, не являются вполне столь большим соглашением, как Вы могли бы думать.

2
ответ дан 1 December 2019 в 06:24
поделиться

Вы думали об использовании Linq к XML? (если Вы используете.Net 3.0 +)

public static XElement ChangeValue(string xmlSnippet, 
    string nodeName,
    string newValue)
{
    XElement snippet = XElement.Parse(xmlSnippet);
    if (snippet != null)
    {
        snippet.Element(nodeName).Value = newValue;
    }
    return snippet;
}

, я предполагаю, что XElement будет работать лучше, чем XmlDocument (хотя не уверенный), базовый объект для XElement является XObject, и да, он должен будет загрузить целый документ.

2
ответ дан 1 December 2019 в 06:24
поделиться

Используя вперед только читатель определенно собирается быть самым эффективным подходом, в этом случае деривация XmlReader кажется соответствующей, что и говорить, хотя это - еще больше работы, чем использование подхода DOM, который загружает весь файл сразу.

XmlReader является, предположительно, улучшением по сравнению с синтаксическим анализатором XML SAX API, который произошел в мире Java, но который стал фактическим стандартом в промышленности (за пределами Microsoft).

, Если Вы просто хотите сделать задание быстро, XmlTextReader существует с этой целью (в.NET).

, Если Вы хотите изучить фактический стандарт, который стабилен (и также доступен на многих языках программирования) и который вынудит Вас кодировать очень эффективно и изящно, но который также чрезвычайно гибок, затем изучите SAX. Однако не беспокоятся самим SAX, если Вы не собираетесь быть создающими очень тайными синтаксическими анализаторами XML. Существует много синтаксических анализаторов там, которые используют SAX под покрытиями.

проверьте мой ответ о SAX здесь для списка ресурсов SAX и действительно творческого .NET идея синтаксического анализатора XML , который использует XmlTextReader в качестве его основы: SAX по сравнению с XmlTextReader - SAX в C#

2
ответ дан 1 December 2019 в 06:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: