解析XDocument而不必继续指定默认命名空间

Tea*_*ild 12 c# xml linq-to-xml xnamespace

我有一些XML数据(类似于下面的示例),我想读取代码中的值.

为什么我被迫指定默认名称空间来访问每个元素?我原本期望默认命名空间用于所有元素.

有没有更合理的方法来实现我的目标?

示例XML:

<?xml version="1.0" encoding="UTF-8"?>
<ReceiptsBatch xmlns="http://www.secretsonline.gov.uk/secrets">
    <MessageHeader>
        <MessageID>00000173</MessageID>
        <Timestamp>2009-10-28T16:50:01</Timestamp>
        <MessageCheck>BX4f+RmNCVCsT5g</MessageCheck>
    </MessageHeader>
    <Receipts>
        <Receipt>
            <Status>OK</Status>
        </Receipt>
    </Receipts>
</ReceiptsBatch>
Run Code Online (Sandbox Code Playgroud)

用于读取我之后的xml元素的代码:

XDocument xDoc = XDocument.Load( FileInPath );

XNamespace ns = "http://www.secretsonline.gov.uk/secrets";

XElement MessageCheck = xDoc.Element(ns+ "MessageHeader").Element(ns+"MessageCheck");
XElement MessageBody = xDoc.Element("Receipts");
Run Code Online (Sandbox Code Playgroud)

Sam*_*Sam 7

根据此答案的建议,您可以通过从文档的内存中副本中删除所有名称空间来完成此操作.我想只有在您知道结果文档中不会发生名称冲突时才应该这样做.

/// <summary>
/// Makes parsing easier by removing the need to specify namespaces for every element.
/// </summary>
private static void RemoveNamespaces(XDocument document)
{
    var elements = document.Descendants();
    elements.Attributes().Where(a => a.IsNamespaceDeclaration).Remove();
    foreach (var element in elements)
    {
        element.Name = element.Name.LocalName;

        var strippedAttributes =
            from originalAttribute in element.Attributes().ToArray()
            select (object)new XAttribute(originalAttribute.Name.LocalName, originalAttribute.Value);

        //Note that this also strips the attributes' line number information
        element.ReplaceAttributes(strippedAttributes.ToArray());
    }
}
Run Code Online (Sandbox Code Playgroud)


Biz*_*ime 5

您可以使用XmlTextReader.Namespaces属性在读取XML文件时禁用名称空间。

string filePath;
XmlTextReader xReader = new XmlTextReader(filePath);
xReader.Namespaces = false;
XDocument xDoc = XDocument.Load(xReader);
Run Code Online (Sandbox Code Playgroud)


Mic*_*Kay 1

理论上,文档的含义不受用户选择的命名空间前缀的影响。只要数据位于命名空间http://www.secretsonline.gov.uk/secrets中,作者是否选择使用前缀“s”、“secrets”、“_x.cafe.babe”并不重要”,或“null”前缀(即,使其成为默认命名空间)。您的应用程序不应该关心:重要的只是 URI。这就是您的应用程序必须指定 URI 的原因。