我有XML文件,元素/属性名称有“:”字符,我如何更新其vales?
<?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>
答案 0 :(得分:2)
我不明白“我如何更新其价值”的含义,但如果您了解这些是XML namespaces,则可能会有所帮助。
IE,my:ECRNo
有一个简单的元素名称ECRNo
,其名称空间前缀为my
,映射到URN或URL - 应使用{{1}声明在XML中(无论是声明它,在父元素处还是在XML根元素中) - 但是在这里提供的XML示例中都没有显示。
要使用xmlns:my=...
更新此内容,您需要使用接受XmlNode
作为第二个参数的重载SelectSingleNode
方法。然后,您需要命名空间管理器上的所有XmlNamespaceManager
方法来注册.AddNamespace
前缀。详情请见http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.selectsinglenode%28v=VS.90%29.aspx。
答案 1 :(得分:1)
您的XML示例无效,如图所示。 my
前缀未在XML中定义。
如果你的XML包含xmlns:my="schemas.microsoft.com/office/infopath/2003/myXSD/…"
,那么XML至少会有一些有效的希望。
要在.NET代码中使用命名空间操作XML,请考虑使用Linq XDocument
而不是XmlDocument
。我发现Linq的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
。
要为元素写入新值,请指定value属性:MNO_Element.Value = "120";
.Single()
声称只有一个节点符合选择条件,类似于.SelectSingleNode()
的{{1}}函数。
从这段代码中可以看出,XML文档中“my”命名空间前缀的名称对于处理XML的代码并不重要 - 它是“my”前缀表示的重要URI。前缀只是简写,因此XML编写器不必在任何地方编写冗长且费力的URI。
编写XML处理代码以与XML名称空间前缀无关是非常重要的,因为前缀名称可以(并且将)从一个XML文档到下一个XML文档,但名称空间URI将是相同的。
答案 2 :(得分: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>