如何更新其名称包含“:”特殊字符的XML元素或属性

时间:2011-12-27 17:17:51

标签: c# xml xml-namespaces

我有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>

3 个答案:

答案 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的XNamespaceXName类型更容易使用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>