2011-12-27 2 views
1

У меня есть XML-файл, а имена элементов/атрибутов имеют символ «:», как я могу обновить его значения?Как я могу обновить элемент XML или атрибут, имя которого содержит специальный символ::

<?xml version="1.0" encoding="utf-8"?> 
<?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.3"?> 
<my:ECR my:NoOfAutho="16" my:hideDetails="0" my:Type="ECR" my:NoOfVBUCMApprovales="10" > 
    <my:ECRNo>148</my:ECRNo> 
    <my:Stage>Approved</my:Stage> 
     <my:Details> 
     <my:ReasonForCR>Reason For CR</my:ReasonForCR> 
     <my:AreaAffected_Publications_VBUCM>false</my:AreaAffected_Publications_VBUCM> 
      <my:AreaAffected_Engineering>true</my:AreaAffected_Engineering> 
      <my:AreaAffected_Production>false</my:AreaAffected_Production> 
      <my:AreaAffected_CustomerSupport>true</my:AreaAffected_CustomerSupport> 
      <my:AreaAffected_VBUCMTest>false</my:AreaAffected_VBUCMTest> 
     </my:AreaAffectedVB_UCM> 
+4

Возможно, вы захотите ознакомиться с [пространствами имен XML] (http://en.wikipedia.org/wiki/XML_namespace). –

+0

Пожалуйста, покажите код, который вы используете сейчас. Кроме того, FYI, это не имена, содержащие «:». Это имена с префиксами пространства имен. –

+0

XmlDocument xmlDoc = новый XmlDocument(); xmlDoc.Load (file.xml); XmlNode node = xmlDoc.SelectSingleNode ("ECR/Type"); node.Attributes [0] .Value = "XYZ"; xmlDoc.Save (file.xml); – Waleed

ответ

1

Ваш образец XML является недействительным, как показано на рисунке. Префикс my не определен в XML.

Если ваш XML содержит xmlns:my="schemas.microsoft.com/office/infopath/2003/myXSD/…", тогда XML, по крайней мере, надеется, что он будет действительным.

Для управления XML с пространствами имен в коде .NET рассмотрите возможность использования Linq XDocument вместо XmlDocument. Я обнаружил, что типы Linq's XNamespace и XName намного проще в использовании с классом классов XDocument, чем старый стиль XmlDocument - довольно неуклюжая обработка пространств имен.

Изменение XML, чтобы добавить атрибут xmlns:my к корневому элементу:

<my:MNO xmlns:my="schemas.microsoft.com/office/infopath/2003/myXSD/…" my:NoOfAutho="16" etc... > 

В коде C# добавить ссылку на материал Linq в верхней части исходного файла:

using System.Xml.Linq; 

Затем используйте код, подобный этому (не проверенный, может содержать опечатки синтаксиса) для загрузки xml и доступа к элементу:

XNamespace ns = "schemas.microsoft.com/office/infopath/2003/myXSD/…"; 
XName MNO_Name = ns + "MNO"; 
XDocument doc = XDocument.Load(path2); 
XElement MNO_Element = doc.Root.Descendants(MNO_Name).Single(); 

Затем вы можете читать или изменять свойства, атрибуты и дочерние элементы элемента MNO.

Для считывания значения <MNO>100</MNO> используйте MNO_Element.Value.

Чтобы записать новое значение элемента, присвоить свойству значение: MNO_Element.Value = "120";

.Single() утверждает, что существует ровно один узел, который соответствует критериям отбора, похожие на .SelectSingleNode() функции XmlDocument.

Как видно из этого кода, имя префикса «my» в XML-документе не имеет значения для кода, обрабатывающего XML - это URI, который представляет собой «мой» префикс, что является важным , Префикс является просто сокращенным, поэтому писателю XML не нужно писать длинные и трудоемкие URI везде.

Написание кода обработки XML, являющегося агностиком префикса пространства имен XML, очень важно, поскольку имя префикса может (и будет) варьироваться от одного документа XML до следующего, но URI пространства имен будет таким же.

+0

Я использовал XmlDocument xmlDoc = новый XmlDocument(); xmlDoc.Load (путь2); XmlNode node = xmlDoc.SelectSingleNode ("ECO/ECONo"); node.Attributes [0] .Value = ECForm.No.ToString(); xmlDoc.Save (путь2); но все же дайте мне ошибку, как я должен написать код для обновлений, например, элемент ECONO? – Waleed

+0

забыли свой файл, вот еще один файл XML Как я могу изменить значения элемента MNO и атрибута MName с помощью C#? – Waleed

+0

Я обновил свой ответ с помощью новых элементов и строк пространства имен. – dthorpe

2

Я не понимаю, что вы имеете в виду «как я могу изменить свои ценности», но это, вероятно, поможет, если вы понимаете, что это XML namespaces.

IE, my:ECRNo имеет простое имя элемента из ECRNo с префиксом пространства имен из my, который отображает в урну или URL - который должен быть объявлен с xmlns:my=... внутри XML (либо, где она объявлена, на родителях , или в корневом элементе XML), но не отображается в примере XML, который вы указали здесь.

Чтобы обновить это, используя XmlNode, вам необходимо использовать перегруженный метод SelectSingleNode, который принимает XmlNamespaceManager в качестве второго аргумента. Затем вам понадобится весь метод .AddNamespace в менеджере пространства имен для регистрации префикса my. Это подробно описано в http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.selectsinglenode%28v=VS.90%29.aspx.

+0

Если я хочу обновить, например; Тип атрибута; должен ли я использовать узел XmlNode = xmlDoc.SelectSingleNode («my: ECR/my: Type»); ? но это дало мне ошибку «:» - это особый характер. – Waleed

+0

забыли свой файл, вот еще один файл XML как я могу изменить значение МНО элемента и MName атрибутов с помощью C#? – Waleed

+0

@ Waleed - тот же ответ. Я дам вам образец рабочего кода позже, если кто-то другой не ударит меня (пожалуйста, не стесняйтесь!). – ziesemer

0

Колонки не являются допустимыми символами в xml-элементах/атрибутах. Это пространства имен.

Ваша линия

<my:ECR my:NoOfAutho="16" my:hideDetails="0" my:Type="ECR" my:NoOfVBUCMApprovales="10" > 

Правильно ссылается на my пространство имен уже, так что вы просто должны быть в состоянии сделать это:

<my:ECR NoOfAutho="16" hideDetails="0" Type="ECR" NoOfVBUCMApprovales="10" > 

И вы должны быть хорошо?

Вы также должны удалить my: из других мест в файле особенно закрывающие теги

</ReasonForCR> 
+0

, но мне нужно сохранить my: в файле и просто обновлять значения атрибутов и элементов с помощью узла XmlNode = xmlDoc.SelectSingleNode («my: ECR/my: Type») ;. как я могу это сделать? – Waleed

+0

забудьте мой файл, вот еще один файл XML как я могу изменить значение МНО элемента и MName атрибутов с помощью C#? – Waleed

+0

@Waleed Я рекомендую обновить свой вопрос (или создать новый?), Чтобы задать этот вопрос напрямую. – McKay