【问题标题】:XElement.Add(XElement) automatically adds namespace to child node?XElement.Add(XElement) 自动将命名空间添加到子节点?
【发布时间】:2011-11-04 00:13:54
【问题描述】:

我正在使用 XElement 来操作我的 xml 文件:找到目标节点,然后将子节点添加到它。但现在我有一个问题。假设我的 xml 文件如下所示:

<Report xmlns="MY_NAMESPACE"
  <Width>100</Width>
  <Height>100</Height>
  <ReportItems>
    <ReportItem>
...
</Report>

我想使用 VB.NET 将新的 &lt;ReportItem&gt; 添加到 &lt;ReportItems&gt; 节点。在这个链接How to: Create a Document with Namespaces (LINQ to XML) (Visual Basic) 中,它说为了声明和使用命名空间,它需要在文件的开头导入它们(它与 C# 的用法不同)。所以我做Imports &lt;xmlns="MY_NAMESPACE"&gt;。现在我需要 1) 首先找到 &lt;ReportItems&gt; 节点,然后 2) 添加我的新节点。为了做第一步,我尝试了

Dim xmldoc = XDocument.Load(MY_XML_FILE_PATH)
Dim target = xmldoc.Root.Elements("{MY_NAMESPACE}" & "ReportItems").FirstOrDefault

为了执行第 2 步),我做到了

Dim newNode As XElement = _
    <ReportItem/>
target.Add(newNode)

现在问题来了:如果我在查询 Root 元素时没有指定"{MY_NAMESPACE}",我根本找不到ReportItems。是因为字符串实际上是用来隐式构造一个XName对象的(天知道为什么我不能显式地将NS赋值给XName对象),而这个对象是用来搜索的。如果我不给出大括号部分,它将在空命名空间中搜索,因此它无法找到 MY_NAMESPACE 中的&lt;ReportItems&gt;node。但是如果我给这个花括号命名空间,最终的 xml 文件将如下所示:

<Report xmlns="MY_NAMESPACE"
  <Width>100</Width>
  <Height>100</Height>
  <ReportItems>
    <ReportItem>
    <ReportItem xmlns="MY_NAMESPACE">    
...
</Report>

第二个&lt;ReportItem&gt; 是新添加的,但遗憾的是这不是一个有效文件(我的解析器在进一步处理xml 文件时抱怨)。那么我怎样才能使这个新项目看起来与现有项目一模一样,没有任何命名空间呢?这一直让我发疯。我花了一整天的时间来弄清楚我需要添加大括号以便它找到目标节点(它不像上面的链接所说的那样工作,它会自动添加和搜索默认 NS),但现在它添加一些不必要的东西?一定是在开玩笑!

【问题讨论】:

    标签: vb.net xml-namespaces linq-to-xml xelement


    【解决方案1】:

    我遇到了类似的问题,我的解决方案是在保存 Xml 时省略重复的命名空间:

    Dim sb As New StringBuilder()
    Dim settings As XmlWriterSettings = New XmlWriterSettings()
    settings.NamespaceHandling = NamespaceHandling.OmitDuplicates
    
    Using writer As XmlWriter = XmlWriter.Create(sb, settings)
        Dim xdoc As XDocument = WriteDocument()
        xdoc.Save(writer)
    End Using
    

    您也可以使用具有 OmitDuplicates 的 SaveOptions 参数调用 XDocument.Save。

    【讨论】:

    • XDocument.CreateReader 方法也支持此功能。 "xDocument.CreateReader(ReaderOptions.OmitDuplicateNamespaces)"
    猜你喜欢
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2011-06-18
    相关资源
    最近更新 更多