Необработанный тип - это имя общего класса или интерфейса без аргументов типа. Например, с учетом общего класса Box:
public class Box {
public void set(T t) { /* ... */ }
// ...
}
Чтобы создать параметризованный тип Box
, вы указываете фактический аргумент типа для параметра формального типа T
:
Box intBox = new Box<>();
Если аргумент фактического типа опущен, вы создаете необработанный тип Box
:
Box rawBox = new Box();
. Поэтому Box
является необработанным типом родового типа Box
. Однако не общий тип или тип интерфейса не является сырым типом.
Необработанные типы отображаются в устаревшем коде, потому что многие классы API (например, классы Collections) не были типичными до JDK 5.0. При использовании сырых типов вы, по существу, получаете поведение перед генериками - Box
дает вам Object
s. Для обратной совместимости допускается присвоение параметризованного типа его необработанному типу:
Box stringBox = new Box<>();
Box rawBox = stringBox; // OK
Но если вы назначаете сырой тип параметризованному типу, вы получите предупреждение:
Box rawBox = new Box(); // rawBox is a raw type of Box
Box intBox = rawBox; // warning: unchecked conversion
Вы также получаете предупреждение, если используете необработанный тип для вызова общих методов, определенных в соответствующем родовом типе:
Box stringBox = new Box<>();
Box rawBox = stringBox;
rawBox.set(8); // warning: unchecked invocation to set(T)
Предупреждение показывает, что необработанные типы обходят общие проверки типа, откладывая улов небезопасных код для выполнения. Поэтому вам следует избегать использования необработанных типов.
В разделе «Тип стирания» содержится дополнительная информация о том, как компилятор Java использует необработанные типы.
As упомянутый ранее, при смешивании устаревшего кода с общим кодом вы можете столкнуться с предупреждающими сообщениями, подобными следующим:
Примечание: Example.java использует непроверенные или небезопасные операции.
Примечание : Перекомпиляция с -Xlint: не проверяется для деталей.
blockquote>Это может произойти при использовании более старого API, который работает с необработанными типами, как показано в следующем примере:
public class WarningDemo { public static void main(String[] args){ Box
bi; bi = createBox(); } static Box createBox(){ return new Box(); } } Термин «непроверенный» означает, что компилятор не имеет достаточной информации о типе для выполнения всех проверок типа, необходимых для обеспечения безопасности типа. Предупреждение «unchecked» по умолчанию отключено, хотя компилятор дает подсказку. Чтобы просмотреть все «непроверенные» предупреждения, перекомпилируйте с помощью -Xlint: unchecked.
Повторная компиляция предыдущего примера с -Xlint: unchecked показывает следующую дополнительную информацию:
WarningDemo.java:4: warning: [unchecked] unchecked conversion found : Box required: Box
bi = createBox(); ^ 1 warning Чтобы полностью отключить unchecked warnings, используйте флаг -Xlint: -unchecked. Аннотации
@SuppressWarnings("unchecked")
подавляют непроверенные предупреждения. Если вы не знакомы с синтаксисом@SuppressWarnings
, см. Аннотации.Исходный источник: Учебники по Java
, наконец, мне удалось:)
if (!File.Exists("Test.xml"))
{
XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
xmlWriterSettings.Indent = true;
xmlWriterSettings.NewLineOnAttributes = true;
using (XmlWriter xmlWriter = XmlWriter.Create("Test.xml", xmlWriterSettings))
{
xmlWriter.WriteStartDocument();
xmlWriter.WriteStartElement("School");
xmlWriter.WriteStartElement("Student");
xmlWriter.WriteElementString("FirstName", firstName);
xmlWriter.WriteElementString("LastName", lastName);
xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();
xmlWriter.WriteEndDocument();
xmlWriter.Flush();
xmlWriter.Close();
}
}
else
{
XDocument xDocument = XDocument.Load("Test.xml");
XElement root= xDocument.Element("School");
IEnumerable<XElement> rows = root.Descendants("Student");
XElement firstRow= rows.First();
firstRow.AddBeforeSelf(
new XElement("Student",
new XElement("FirstName", firstName),
new XElement("LastName", lastName)));
xDocument.Save("Test.xml");
}
У меня есть предложение в следующий раз:
string nameFile = "Test.xml";
bool newFile = false;
if (!File.Exists(nameFile))
{
newFile = true;
XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
xmlWriterSettings.Indent = true;
xmlWriterSettings.NewLineOnAttributes = true;
xmlWriter.WriteStartDocument();
xmlWriter.WriteStartElement("School");
xmlWriter = XmlWriter.Create("Test.xml", xmlWriterSettings))
}
else
{
doc = new XmlDocument();
doc.Load(nameFile);
// Create a XPathNavigator
// You can go where you want to add
// In this case it is just after last child of the roor
XPathNavigator navigator = doc.CreateNavigator();
navigator.MoveToChild("School", "");
xmlWriter = navigator.AppendChild();
}
// From here you can work only with xmlWriter,
// One will point on a file and the other on the stream of xmlDocument
// So you will need to save the document in the second choise
xmlWriter.WriteStartElement("Student");
xmlWriter.WriteElementString("FirstName", firstName);
xmlWriter.WriteElementString("LastName", lastName);
xmlWriter.WriteEndElement();
// End document / close or save.
if (newFile)
xmlWriter.WriteEndDocument();
xmlWriter.Close();
if (!newFile)
doc.Save(nameFile);
Он должен работать. :)
Я знаю, что вы попросили XmlWriter, но я считаю, что вы можете добиться этого, используя меньше кода с XDocument. Вот мое решение:
var filePath = "path/XmlFile.xml";
var xmlDoc = XDocument.Load(filePath);
var parentElement = new XElement("Student");
var firstNameElement = new XElement("FirstName", firstNameVariable);
var lastNameElement = new XElement("LastName", lastNameVariable);
parentElement.Add(firstNameElement);
parentElement.Add(lastNameElement);
var rootElement = xmlDoc.Element("School");
rootElement?.Add(parentElement);
xmlDoc.save();
Это основано на следующей структуре XML и будет добавлено в ...
:
<School>
<Student>
<FirstName>John</FirstName>
<LastName>Johnson</LastName>
</Student>
...
</School>
Надеюсь, что это поможет!
вы можете использовать Linq Xml
XDocument doc = XDocument.Load(xmlFilePath);
XElement school = doc.Element("School");
school.Add(new XElement("Student",
new XElement("FirstName", "David"),
new XElement("LastName", "Smith")));
doc.Save(xmlFilePath);
Edit
, если вы хотите добавить элемент в существующий <Student>
, просто добавьте атрибут перед
school.add(new XElement("Student",
new XAttribute("ID", "ID_Value"),
new XElement("FirstName", "David"),
new XElement("LastName", "Smith")));
Затем вы можете добавить дополнительные данные в существующий <Student>
путем поиска -> get -> add
XElement particularStudent = doc.Element("School").Elements("Student")
.Where(student => student.Attribute("ID").Value == "SearchID")
.FirstOrDefault();
if(particularStudent != null)
particularStudent.Add(new XElement("<NEwElementName>","<Value>");